1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "bundle_permission_mgr.h"
17
18 #include "app_log_tag_wrapper.h"
19 #include "app_log_wrapper.h"
20 #include "bundle_mgr_service.h"
21 #include "bundle_parser.h"
22 #include "ipc_skeleton.h"
23 #include "parameter.h"
24 #include "privacy_kit.h"
25 #include "tokenid_kit.h"
26
27 namespace OHOS {
28 namespace AppExecFwk {
29 namespace {
30 // pre bundle profile
31 constexpr const char* INSTALL_LIST_PERMISSIONS_CONFIG = "/etc/app/install_list_permissions.json";
32 constexpr const char* SCENEBOARD_BUNDLE_NAME = "com.ohos.sceneboard";
33 // install list permissions file
34 constexpr const char* INSTALL_LIST_PERMISSIONS_FILE_PATH = "/system/etc/app/install_list_permissions.json";
35 constexpr int16_t BASE_API_VERSION = 1000;
36 }
37
38 using namespace OHOS::Security;
39 std::map<std::string, DefaultPermission> BundlePermissionMgr::defaultPermissions_;
40
Init()41 bool BundlePermissionMgr::Init()
42 {
43 std::vector<std::string> permissionFileList;
44 #ifdef USE_PRE_BUNDLE_PROFILE
45 std::vector<std::string> rootDirList;
46 BMSEventHandler::GetPreInstallRootDirList(rootDirList);
47 if (rootDirList.empty()) {
48 LOG_E(BMS_TAG_DEFAULT, "rootDirList is empty");
49 return false;
50 }
51 for (const auto &item : rootDirList) {
52 permissionFileList.push_back(item + INSTALL_LIST_PERMISSIONS_CONFIG);
53 }
54 #else
55 permissionFileList.emplace_back(INSTALL_LIST_PERMISSIONS_FILE_PATH);
56 #endif
57 BundleParser bundleParser;
58 std::set<DefaultPermission> permissions;
59 for (const auto &permissionFile : permissionFileList) {
60 if (bundleParser.ParseDefaultPermission(permissionFile, permissions) != ERR_OK) {
61 LOG_D(BMS_TAG_DEFAULT, "BundlePermissionMgr::Init failed");
62 continue;
63 }
64 }
65
66 defaultPermissions_.clear();
67 for (const auto &permission : permissions) {
68 defaultPermissions_.try_emplace(permission.bundleName, permission);
69 }
70 LOG_D(BMS_TAG_DEFAULT, "BundlePermissionMgr::Init success");
71 return true;
72 }
73
UnInit()74 void BundlePermissionMgr::UnInit()
75 {
76 LOG_D(BMS_TAG_DEFAULT, "BundlePermissionMgr::UnInit");
77 defaultPermissions_.clear();
78 }
79
ConvertPermissionDef( const AccessToken::PermissionDef &permDef, PermissionDef &permissionDef)80 void BundlePermissionMgr::ConvertPermissionDef(
81 const AccessToken::PermissionDef &permDef, PermissionDef &permissionDef)
82 {
83 permissionDef.permissionName = permDef.permissionName;
84 permissionDef.bundleName = permDef.bundleName;
85 permissionDef.grantMode = permDef.grantMode;
86 permissionDef.availableLevel = permDef.availableLevel;
87 permissionDef.provisionEnable = permDef.provisionEnable;
88 permissionDef.distributedSceneEnable = permDef.distributedSceneEnable;
89 permissionDef.label = permDef.label;
90 permissionDef.labelId = permDef.labelId;
91 permissionDef.description = permDef.description;
92 permissionDef.descriptionId = permDef.descriptionId;
93 permissionDef.availableType = permDef.availableType;
94 }
95
96 // Convert from the struct DefinePermission that parsed from config.json
ConvertPermissionDef( AccessToken::PermissionDef &permDef, const DefinePermission &definePermission, const std::string &bundleName)97 void BundlePermissionMgr::ConvertPermissionDef(
98 AccessToken::PermissionDef &permDef, const DefinePermission &definePermission, const std::string &bundleName)
99 {
100 permDef.permissionName = definePermission.name;
101 permDef.bundleName = bundleName;
102 permDef.grantMode = [&definePermission]() -> int {
103 if (definePermission.grantMode ==
104 Profile::DEFINEPERMISSION_GRANT_MODE_SYSTEM_GRANT) {
105 return AccessToken::GrantMode::SYSTEM_GRANT;
106 }
107 return AccessToken::GrantMode::USER_GRANT;
108 }();
109
110 permDef.availableLevel = GetTokenApl(definePermission.availableLevel);
111 permDef.provisionEnable = definePermission.provisionEnable;
112 permDef.distributedSceneEnable = definePermission.distributedSceneEnable;
113 permDef.label = definePermission.label;
114 permDef.labelId = definePermission.labelId;
115 permDef.description = definePermission.description;
116 permDef.descriptionId = definePermission.descriptionId;
117 permDef.availableType = GetAvailableType(definePermission.availableType);
118 }
119
GetAvailableType( const std::string &availableType)120 AccessToken::ATokenAvailableTypeEnum BundlePermissionMgr::GetAvailableType(
121 const std::string &availableType)
122 {
123 if (availableType == Profile::DEFINEPERMISSION_AVAILABLE_TYPE_MDM) {
124 return AccessToken::ATokenAvailableTypeEnum::MDM;
125 }
126 return AccessToken::ATokenAvailableTypeEnum::NORMAL;
127 }
128
GetTokenApl(const std::string &apl)129 AccessToken::ATokenAplEnum BundlePermissionMgr::GetTokenApl(const std::string &apl)
130 {
131 if (apl == Profile::AVAILABLELEVEL_SYSTEM_CORE) {
132 return AccessToken::ATokenAplEnum::APL_SYSTEM_CORE;
133 }
134 if (apl == Profile::AVAILABLELEVEL_SYSTEM_BASIC) {
135 return AccessToken::ATokenAplEnum::APL_SYSTEM_BASIC;
136 }
137 return AccessToken::ATokenAplEnum::APL_NORMAL;
138 }
139
CreateHapPolicyParam(const InnerBundleInfo &innerBundleInfo)140 AccessToken::HapPolicyParams BundlePermissionMgr::CreateHapPolicyParam(const InnerBundleInfo &innerBundleInfo)
141 {
142 AccessToken::HapPolicyParams hapPolicy;
143 std::string apl = innerBundleInfo.GetAppPrivilegeLevel();
144 std::vector<AccessToken::PermissionDef> permDef = GetPermissionDefList(innerBundleInfo);
145 hapPolicy.apl = GetTokenApl(apl);
146 hapPolicy.domain = "domain";
147 hapPolicy.permList = permDef;
148 hapPolicy.permStateList = GetPermissionStateFullList(innerBundleInfo);
149 hapPolicy.aclRequestedList = innerBundleInfo.GetAllowedAcls();
150 LOG_NOFUNC_I(BMS_TAG_DEFAULT, "-n %{public}s apl:%{public}s req permission size:%{public}zu, acls size:%{public}zu",
151 innerBundleInfo.GetBundleName().c_str(), apl.c_str(), hapPolicy.permStateList.size(),
152 hapPolicy.aclRequestedList.size());
153 // default permission list
154 DefaultPermission permission;
155 if (!GetDefaultPermission(innerBundleInfo.GetBundleName(), permission)) {
156 return hapPolicy;
157 }
158
159 #ifdef USE_PRE_BUNDLE_PROFILE
160 if (!MatchSignature(permission, innerBundleInfo.GetCertificateFingerprint()) &&
161 !MatchSignature(permission, innerBundleInfo.GetAppId()) &&
162 !MatchSignature(permission, innerBundleInfo.GetAppIdentifier()) &&
163 !MatchSignature(permission, innerBundleInfo.GetOldAppIds())) {
164 LOG_W(BMS_TAG_DEFAULT, "bundleName:%{public}s MatchSignature failed", innerBundleInfo.GetBundleName().c_str());
165 return hapPolicy;
166 }
167 #endif
168 for (const auto &perm: innerBundleInfo.GetAllRequestPermissions()) {
169 bool userCancellable = false;
170 if (!CheckPermissionInDefaultPermissions(permission, perm.name, userCancellable)) {
171 continue;
172 }
173 AccessToken::PreAuthorizationInfo preAuthorizationInfo;
174 preAuthorizationInfo.permissionName = perm.name;
175 preAuthorizationInfo.userCancelable = userCancellable;
176 hapPolicy.preAuthorizationInfo.emplace_back(preAuthorizationInfo);
177 }
178 LOG_I(BMS_TAG_DEFAULT, "end, preAuthorizationInfo size :%{public}zu", hapPolicy.preAuthorizationInfo.size());
179 return hapPolicy;
180 }
181
DeleteAccessTokenId(const AccessToken::AccessTokenID tokenId)182 int32_t BundlePermissionMgr::DeleteAccessTokenId(const AccessToken::AccessTokenID tokenId)
183 {
184 return AccessToken::AccessTokenKit::DeleteToken(tokenId);
185 }
186
ClearUserGrantedPermissionState(const AccessToken::AccessTokenID tokenId)187 int32_t BundlePermissionMgr::ClearUserGrantedPermissionState(const AccessToken::AccessTokenID tokenId)
188 {
189 return AccessToken::AccessTokenKit::ClearUserGrantedPermissionState(tokenId);
190 }
191
GetPermissionDefList( const InnerBundleInfo &innerBundleInfo)192 std::vector<AccessToken::PermissionDef> BundlePermissionMgr::GetPermissionDefList(
193 const InnerBundleInfo &innerBundleInfo)
194 {
195 const auto bundleName = innerBundleInfo.GetBundleName();
196 const auto defPermissions = innerBundleInfo.GetAllDefinePermissions();
197 std::vector<AccessToken::PermissionDef> permList;
198 if (!defPermissions.empty()) {
199 for (const auto &defPermission : defPermissions) {
200 AccessToken::PermissionDef perm;
201 LOG_D(BMS_TAG_DEFAULT, "defPermission %{public}s", defPermission.name.c_str());
202 ConvertPermissionDef(perm, defPermission, bundleName);
203 permList.emplace_back(perm);
204 }
205 }
206 return permList;
207 }
208
GetPermissionStateFullList( const InnerBundleInfo &innerBundleInfo)209 std::vector<AccessToken::PermissionStateFull> BundlePermissionMgr::GetPermissionStateFullList(
210 const InnerBundleInfo &innerBundleInfo)
211 {
212 auto reqPermissions = innerBundleInfo.GetAllRequestPermissions();
213 std::vector<AccessToken::PermissionStateFull> permStateFullList;
214 if (!reqPermissions.empty()) {
215 for (const auto &reqPermission : reqPermissions) {
216 AccessToken::PermissionStateFull perState;
217 perState.permissionName = reqPermission.name;
218 perState.isGeneral = true;
219 perState.resDeviceID.emplace_back(innerBundleInfo.GetBaseApplicationInfo().deviceId);
220 perState.grantStatus.emplace_back(AccessToken::PermissionState::PERMISSION_DENIED);
221 perState.grantFlags.emplace_back(AccessToken::PermissionFlag::PERMISSION_DEFAULT_FLAG);
222 permStateFullList.emplace_back(perState);
223 }
224 } else {
225 LOG_D(BMS_TAG_DEFAULT, "BundlePermissionMgr::GetPermissionStateFullList requestPermission is empty");
226 }
227 return permStateFullList;
228 }
229
GetAllReqPermissionStateFull(AccessToken::AccessTokenID tokenId, std::vector<AccessToken::PermissionStateFull> &newPermissionState)230 bool BundlePermissionMgr::GetAllReqPermissionStateFull(AccessToken::AccessTokenID tokenId,
231 std::vector<AccessToken::PermissionStateFull> &newPermissionState)
232 {
233 std::vector<AccessToken::PermissionStateFull> userGrantReqPermList;
234 int32_t ret = AccessToken::AccessTokenKit::GetReqPermissions(tokenId, userGrantReqPermList, false);
235 if (ret != AccessToken::AccessTokenKitRet::RET_SUCCESS) {
236 LOG_E(BMS_TAG_DEFAULT, "GetAllReqPermissionStateFull get user grant failed errcode: %{public}d", ret);
237 return false;
238 }
239 std::vector<AccessToken::PermissionStateFull> systemGrantReqPermList;
240 ret = AccessToken::AccessTokenKit::GetReqPermissions(tokenId, systemGrantReqPermList, true);
241 if (ret != AccessToken::AccessTokenKitRet::RET_SUCCESS) {
242 LOG_E(BMS_TAG_DEFAULT, "GetAllReqPermissionStateFull get system grant failed errcode: %{public}d", ret);
243 return false;
244 }
245 newPermissionState = userGrantReqPermList;
246 std::copy(systemGrantReqPermList.begin(), systemGrantReqPermList.end(), std::back_inserter(newPermissionState));
247 return true;
248 }
249
GetRequestPermissionStates( BundleInfo &bundleInfo, uint32_t tokenId, const std::string deviceId)250 bool BundlePermissionMgr::GetRequestPermissionStates(
251 BundleInfo &bundleInfo, uint32_t tokenId, const std::string deviceId)
252 {
253 std::vector<std::string> requestPermission = bundleInfo.reqPermissions;
254 if (requestPermission.empty()) {
255 LOG_D(BMS_TAG_DEFAULT, "GetRequestPermissionStates requestPermission empty");
256 return true;
257 }
258 std::vector<Security::AccessToken::PermissionStateFull> allPermissionState;
259 if (!GetAllReqPermissionStateFull(tokenId, allPermissionState)) {
260 LOG_W(BMS_TAG_DEFAULT, "BundlePermissionMgr::GetRequestPermissionStates failed");
261 }
262 for (auto &req : requestPermission) {
263 auto iter = std::find_if(allPermissionState.begin(), allPermissionState.end(),
264 [&req](const auto &perm) {
265 return perm.permissionName == req;
266 });
267 if (iter != allPermissionState.end()) {
268 LOG_D(BMS_TAG_DEFAULT, "GetRequestPermissionStates request permission name: %{public}s", req.c_str());
269 for (std::vector<std::string>::size_type i = 0; i < iter->resDeviceID.size(); i++) {
270 if (iter->resDeviceID[i] == deviceId) {
271 bundleInfo.reqPermissionStates.emplace_back(iter->grantStatus[i]);
272 break;
273 }
274 }
275 } else {
276 LOG_E(BMS_TAG_DEFAULT, "request permission name : %{public}s is not exit in AccessTokenMgr", req.c_str());
277 bundleInfo.reqPermissionStates.emplace_back(
278 static_cast<int32_t>(AccessToken::PermissionState::PERMISSION_DENIED));
279 }
280 }
281 return true;
282 }
283
VerifyCallingPermissionForAll(const std::string &permissionName)284 bool BundlePermissionMgr::VerifyCallingPermissionForAll(const std::string &permissionName)
285 {
286 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
287 LOG_D(BMS_TAG_DEFAULT, "VerifyCallingPermission permission %{public}s, callerToken : %{public}u",
288 permissionName.c_str(), callerToken);
289 if (AccessToken::AccessTokenKit::VerifyAccessToken(callerToken, permissionName) ==
290 AccessToken::PermissionState::PERMISSION_GRANTED) {
291 return true;
292 }
293 LOG_NOFUNC_E(BMS_TAG_DEFAULT, "permission denied caller:%{public}u", callerToken);
294 return false;
295 }
296
VerifyCallingPermissionsForAll(const std::vector<std::string> &permissionNames)297 bool BundlePermissionMgr::VerifyCallingPermissionsForAll(const std::vector<std::string> &permissionNames)
298 {
299 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
300 for (auto permissionName : permissionNames) {
301 if (AccessToken::AccessTokenKit::VerifyAccessToken(callerToken, permissionName) ==
302 AccessToken::PermissionState::PERMISSION_GRANTED) {
303 LOG_D(BMS_TAG_DEFAULT, "verify success");
304 return true;
305 }
306 }
307 std::string errorMessage;
308 for (auto deniedPermission : permissionNames) {
309 errorMessage += deniedPermission + " ";
310 }
311 LOG_NOFUNC_E(BMS_TAG_DEFAULT, "%{public}s denied callerToken:%{public}u", errorMessage.c_str(), callerToken);
312 return false;
313 }
314
VerifyPermission( const std::string &bundleName, const std::string &permissionName, const int32_t userId)315 int32_t BundlePermissionMgr::VerifyPermission(
316 const std::string &bundleName, const std::string &permissionName, const int32_t userId)
317 {
318 LOG_D(BMS_TAG_DEFAULT, "VerifyPermission bundleName %{public}s, permission %{public}s", bundleName.c_str(),
319 permissionName.c_str());
320 AccessToken::AccessTokenID tokenId = AccessToken::AccessTokenKit::GetHapTokenID(userId,
321 bundleName, 0);
322 return AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, permissionName);
323 }
324
GetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)325 ErrCode BundlePermissionMgr::GetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
326 {
327 LOG_D(BMS_TAG_DEFAULT, "BundlePermissionMgr::GetPermissionDef permission %{public}s", permissionName.c_str());
328 AccessToken::PermissionDef accessTokenPermDef;
329 int32_t ret = AccessToken::AccessTokenKit::GetDefPermission(permissionName, accessTokenPermDef);
330 if (ret == AccessToken::AccessTokenKitRet::RET_SUCCESS) {
331 ConvertPermissionDef(accessTokenPermDef, permissionDef);
332 return ERR_OK;
333 }
334 return ERR_BUNDLE_MANAGER_QUERY_PERMISSION_DEFINE_FAILED;
335 }
336
CheckPermissionInDefaultPermissions(const DefaultPermission &defaultPermission, const std::string &permissionName, bool &userCancellable)337 bool BundlePermissionMgr::CheckPermissionInDefaultPermissions(const DefaultPermission &defaultPermission,
338 const std::string &permissionName, bool &userCancellable)
339 {
340 auto &grantPermission = defaultPermission.grantPermission;
341 auto iter = std::find_if(grantPermission.begin(), grantPermission.end(), [&permissionName](const auto &defPerm) {
342 return defPerm.name == permissionName;
343 });
344 if (iter == grantPermission.end()) {
345 LOG_D(BMS_TAG_DEFAULT, "can not find permission(%{public}s)", permissionName.c_str());
346 return false;
347 }
348
349 userCancellable = iter->userCancellable;
350 return true;
351 }
352
GetDefaultPermission( const std::string &bundleName, DefaultPermission &permission)353 bool BundlePermissionMgr::GetDefaultPermission(
354 const std::string &bundleName, DefaultPermission &permission)
355 {
356 auto iter = defaultPermissions_.find(bundleName);
357 if (iter == defaultPermissions_.end()) {
358 LOG_NOFUNC_W(BMS_TAG_DEFAULT, "-n %{public}s not exist in defaultPermissions",
359 bundleName.c_str());
360 return false;
361 }
362
363 permission = iter->second;
364 return true;
365 }
366
MatchSignature( const DefaultPermission &permission, const std::vector<std::string> &signatures)367 bool BundlePermissionMgr::MatchSignature(
368 const DefaultPermission &permission, const std::vector<std::string> &signatures)
369 {
370 if (permission.appSignature.empty()) {
371 LOG_W(BMS_TAG_DEFAULT, "appSignature is empty");
372 return false;
373 }
374 for (const auto &signature : permission.appSignature) {
375 if (std::find(signatures.begin(), signatures.end(), signature) != signatures.end()) {
376 return true;
377 }
378 }
379
380 return false;
381 }
382
MatchSignature( const DefaultPermission &permission, const std::string &signature)383 bool BundlePermissionMgr::MatchSignature(
384 const DefaultPermission &permission, const std::string &signature)
385 {
386 if (permission.appSignature.empty() || signature.empty()) {
387 LOG_W(BMS_TAG_DEFAULT, "appSignature or signature is empty");
388 return false;
389 }
390 return std::find(permission.appSignature.begin(), permission.appSignature.end(),
391 signature) != permission.appSignature.end();
392 }
393
GetHapApiVersion()394 int32_t BundlePermissionMgr::GetHapApiVersion()
395 {
396 // get appApiVersion from applicationInfo
397 std::string bundleName;
398 auto uid = IPCSkeleton::GetCallingUid();
399 auto userId = uid / Constants::BASE_USER_RANGE;
400 auto dataMgr = DelayedSingleton<BundleMgrService>::GetInstance()->GetDataMgr();
401 if (dataMgr == nullptr) {
402 LOG_E(BMS_TAG_DEFAULT, "DataMgr is nullptr");
403 return Constants::INVALID_API_VERSION;
404 }
405 auto ret = dataMgr->GetBundleNameForUid(uid, bundleName);
406 if (!ret) {
407 LOG_E(BMS_TAG_DEFAULT, "getBundleName failed, uid : %{public}d", uid);
408 return Constants::INVALID_API_VERSION;
409 }
410 ApplicationInfo applicationInfo;
411 auto res = dataMgr->GetApplicationInfoV9(bundleName,
412 static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), userId, applicationInfo);
413 if (res != ERR_OK) {
414 LOG_E(BMS_TAG_DEFAULT, "getApplicationInfo failed");
415 return Constants::INVALID_API_VERSION;
416 }
417 auto appApiVersion = applicationInfo.apiTargetVersion % BASE_API_VERSION;
418 LOG_D(BMS_TAG_DEFAULT, "appApiVersion is %{public}d", appApiVersion);
419 auto systemApiVersion = GetSdkApiVersion();
420 // api version is the minimum value of {appApiVersion, systemApiVersion}
421 return systemApiVersion < appApiVersion ? systemApiVersion :appApiVersion;
422 }
423
424 // if the api has been system api since it is published, then beginSystemApiVersion can be omitted
VerifySystemApp(int32_t beginSystemApiVersion)425 bool BundlePermissionMgr::VerifySystemApp(int32_t beginSystemApiVersion)
426 {
427 LOG_D(BMS_TAG_DEFAULT, "verifying systemApp");
428 uint64_t accessTokenIdEx = IPCSkeleton::GetCallingFullTokenID();
429 if (Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIdEx)) {
430 return true;
431 }
432 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
433 AccessToken::ATokenTypeEnum tokenType = AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
434 LOG_D(BMS_TAG_DEFAULT, "tokenType is %{private}d", tokenType);
435 int32_t callingUid = IPCSkeleton::GetCallingUid();
436 if (tokenType == AccessToken::ATokenTypeEnum::TOKEN_NATIVE ||
437 tokenType == AccessToken::ATokenTypeEnum::TOKEN_SHELL ||
438 callingUid == Constants::ROOT_UID ||
439 callingUid == ServiceConstants::SHELL_UID) {
440 LOG_D(BMS_TAG_DEFAULT, "caller tokenType is native, verify success");
441 return true;
442 }
443 if (beginSystemApiVersion != Constants::ALL_VERSIONCODE) {
444 auto apiVersion = GetHapApiVersion();
445 if (apiVersion == Constants::INVALID_API_VERSION) {
446 LOG_E(BMS_TAG_DEFAULT, "get api version failed, system app verification failed");
447 return false;
448 }
449 if (apiVersion < beginSystemApiVersion) {
450 LOG_I(BMS_TAG_DEFAULT, "previous app calling, verify success");
451 return true;
452 }
453 }
454 LOG_E(BMS_TAG_DEFAULT, "system app verification failed");
455 return false;
456 }
457
IsSystemApp()458 bool BundlePermissionMgr::IsSystemApp()
459 {
460 LOG_D(BMS_TAG_DEFAULT, "verifying systemApp");
461 uint64_t accessTokenIdEx = IPCSkeleton::GetCallingFullTokenID();
462 if (Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIdEx)) {
463 return true;
464 }
465 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
466 AccessToken::ATokenTypeEnum tokenType = AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
467 if (tokenType == AccessToken::ATokenTypeEnum::TOKEN_HAP) {
468 LOG_E(BMS_TAG_DEFAULT, "IsSystemApp %{public}d,%{public}d,%{public}u",
469 IPCSkeleton::GetCallingUid(), IPCSkeleton::GetCallingPid(), callerToken);
470 return false;
471 }
472 LOG_D(BMS_TAG_DEFAULT, "caller tokenType is not hap, ignore");
473 return true;
474 }
475
IsNativeTokenType()476 bool BundlePermissionMgr::IsNativeTokenType()
477 {
478 LOG_D(BMS_TAG_DEFAULT, "begin to verify token type");
479 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
480 AccessToken::ATokenTypeEnum tokenType = AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
481 LOG_D(BMS_TAG_DEFAULT, "tokenType is %{private}d", tokenType);
482 if (tokenType == AccessToken::ATokenTypeEnum::TOKEN_NATIVE
483 || tokenType == AccessToken::ATokenTypeEnum::TOKEN_SHELL) {
484 LOG_D(BMS_TAG_DEFAULT, "caller tokenType is native, verify success");
485 return true;
486 }
487 if (VerifyCallingUid()) {
488 LOG_D(BMS_TAG_DEFAULT, "caller is root or foundation or BMS_UID, verify success");
489 return true;
490 }
491 LOG_E(BMS_TAG_DEFAULT, "caller tokenType not native, verify failed");
492 return false;
493 }
494
IsShellTokenType()495 bool BundlePermissionMgr::IsShellTokenType()
496 {
497 LOG_D(BMS_TAG_DEFAULT, "IsShellTokenType begin");
498 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
499 AccessToken::ATokenTypeEnum tokenType = AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
500 LOG_D(BMS_TAG_DEFAULT, "tokenType is %{private}d", tokenType);
501 if (tokenType == AccessToken::ATokenTypeEnum::TOKEN_SHELL) {
502 LOG_D(BMS_TAG_DEFAULT, "caller is shell, success");
503 return true;
504 }
505 LOG_I(BMS_TAG_DEFAULT, "caller not shell");
506 return false;
507 }
508
VerifyCallingUid()509 bool BundlePermissionMgr::VerifyCallingUid()
510 {
511 LOG_D(BMS_TAG_DEFAULT, "begin to verify calling uid");
512 int32_t callingUid = IPCSkeleton::GetCallingUid();
513 LOG_D(BMS_TAG_DEFAULT, "calling uid is %{public}d", callingUid);
514 if (callingUid == Constants::ROOT_UID ||
515 callingUid == Constants::FOUNDATION_UID ||
516 callingUid == ServiceConstants::SHELL_UID ||
517 callingUid == ServiceConstants::BMS_UID) {
518 LOG_D(BMS_TAG_DEFAULT, "caller is root or foundation, verify success");
519 return true;
520 }
521 LOG_E(BMS_TAG_DEFAULT, "verify calling uid failed");
522 return false;
523 }
524
VerifyPreload(const AAFwk::Want &want)525 bool BundlePermissionMgr::VerifyPreload(const AAFwk::Want &want)
526 {
527 std::string callingBundleName;
528 auto uid = IPCSkeleton::GetCallingUid();
529 auto dataMgr = DelayedSingleton<BundleMgrService>::GetInstance()->GetDataMgr();
530 if (dataMgr == nullptr) {
531 LOG_E(BMS_TAG_DEFAULT, "DataMgr is nullptr");
532 return false;
533 }
534 auto ret = dataMgr->GetBundleNameForUid(uid, callingBundleName);
535 if (!ret) {
536 return BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
537 }
538 std::string bundleName = want.GetElement().GetBundleName();
539 return bundleName == callingBundleName || callingBundleName == SCENEBOARD_BUNDLE_NAME;
540 }
541
IsCallingUidValid(int32_t uid)542 bool BundlePermissionMgr::IsCallingUidValid(int32_t uid)
543 {
544 int32_t callingUid = IPCSkeleton::GetCallingUid();
545 if (callingUid == uid) {
546 return true;
547 }
548 LOG_E(BMS_TAG_DEFAULT, "IsCallingUidValid failed, uid = %{public}d, calling uid = %{public}d", uid, callingUid);
549 return false;
550 }
551
IsSelfCalling()552 bool BundlePermissionMgr::IsSelfCalling()
553 {
554 int32_t callingUid = IPCSkeleton::GetCallingUid();
555 if (callingUid == Constants::FOUNDATION_UID) {
556 return true;
557 }
558 return false;
559 }
560
VerifyUninstallPermission()561 bool BundlePermissionMgr::VerifyUninstallPermission()
562 {
563 if (!BundlePermissionMgr::IsSelfCalling() &&
564 !BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_INSTALL_BUNDLE,
565 ServiceConstants::PERMISSION_UNINSTALL_BUNDLE})) {
566 LOG_E(BMS_TAG_DEFAULT, "uninstall bundle permission denied");
567 return false;
568 }
569 return true;
570 }
571
VerifyRecoverPermission()572 bool BundlePermissionMgr::VerifyRecoverPermission()
573 {
574 if (!BundlePermissionMgr::IsSelfCalling() &&
575 !BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_INSTALL_BUNDLE,
576 ServiceConstants::PERMISSION_RECOVER_BUNDLE})) {
577 LOG_E(BMS_TAG_DEFAULT, "recover bundle permission denied");
578 return false;
579 }
580 return true;
581 }
582
AddPermissionUsedRecord( const std::string &permission, int32_t successCount, int32_t failCount)583 void BundlePermissionMgr::AddPermissionUsedRecord(
584 const std::string &permission, int32_t successCount, int32_t failCount)
585 {
586 LOG_D(BMS_TAG_DEFAULT, "AddPermissionUsedRecord permission:%{public}s", permission.c_str());
587 AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
588 AccessToken::ATokenTypeEnum tokenType = AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
589 if (tokenType == AccessToken::ATokenTypeEnum::TOKEN_HAP) {
590 int32_t ret = AccessToken::PrivacyKit::AddPermissionUsedRecord(callerToken, permission,
591 successCount, failCount);
592 if (ret != AccessToken::AccessTokenKitRet::RET_SUCCESS) {
593 APP_LOGE("AddPermissionUsedRecord failed, ret = %{public}d", ret);
594 }
595 }
596 }
597
IsBundleSelfCalling(const std::string &bundleName)598 bool BundlePermissionMgr::IsBundleSelfCalling(const std::string &bundleName)
599 {
600 auto dataMgr = DelayedSingleton<BundleMgrService>::GetInstance()->GetDataMgr();
601 if (dataMgr == nullptr) {
602 LOG_E(BMS_TAG_DEFAULT, "DataMgr is nullptr");
603 return false;
604 }
605 int32_t callingUid = IPCSkeleton::GetCallingUid();
606 LOG_D(BMS_TAG_DEFAULT, "start, callingUid: %{public}d", callingUid);
607 std::string callingBundleName;
608 if (dataMgr->GetNameForUid(callingUid, callingBundleName) != ERR_OK) {
609 return false;
610 }
611 LOG_D(BMS_TAG_DEFAULT, "bundleName :%{public}s, callingBundleName : %{public}s",
612 bundleName.c_str(), callingBundleName.c_str());
613 if (bundleName != callingBundleName) {
614 LOG_W(BMS_TAG_DEFAULT, "failed, callingUid: %{public}d", callingUid);
615 return false;
616 }
617 LOG_D(BMS_TAG_DEFAULT, "end, verify success");
618 return true;
619 }
620
VerifyCallingBundleSdkVersion(int32_t beginApiVersion)621 bool BundlePermissionMgr::VerifyCallingBundleSdkVersion(int32_t beginApiVersion)
622 {
623 auto dataMgr = DelayedSingleton<BundleMgrService>::GetInstance()->GetDataMgr();
624 if (dataMgr == nullptr) {
625 LOG_E(BMS_TAG_DEFAULT, "DataMgr is nullptr");
626 return false;
627 }
628 int32_t callingUid = IPCSkeleton::GetCallingUid();
629 LOG_D(BMS_TAG_DEFAULT, "start, callingUid: %{public}d", callingUid);
630 std::string callingBundleName;
631 if (dataMgr->GetNameForUid(callingUid, callingBundleName) != ERR_OK) {
632 return false;
633 }
634 auto userId = callingUid / Constants::BASE_USER_RANGE;
635 ApplicationInfo applicationInfo;
636 auto res = dataMgr->GetApplicationInfoV9(callingBundleName,
637 static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), userId, applicationInfo);
638 if (res != ERR_OK) {
639 LOG_E(BMS_TAG_DEFAULT, "getApplicationInfo failed, callingBundleName:%{public}s", callingBundleName.c_str());
640 return false;
641 }
642 auto systemApiVersion = GetSdkApiVersion();
643 auto appApiVersion = applicationInfo.apiTargetVersion;
644 // api version is the minimum value of {appApiVersion, systemApiVersion}
645 appApiVersion = systemApiVersion < appApiVersion ? systemApiVersion : appApiVersion;
646 LOG_D(BMS_TAG_DEFAULT, "appApiVersion: %{public}d", appApiVersion);
647
648 if ((appApiVersion % BASE_API_VERSION) < beginApiVersion) {
649 LOG_I(BMS_TAG_DEFAULT, "previous app calling, verify success");
650 return true;
651 }
652 return false;
653 }
654
655 Security::AccessToken::HapInfoParams BundlePermissionMgr::CreateHapInfoParams(const InnerBundleInfo &innerBundleInfo,
656 const int32_t userId, const int32_t dlpType)
657 {
658 AccessToken::HapInfoParams hapInfo;
659 hapInfo.userID = userId;
660 hapInfo.bundleName = innerBundleInfo.GetBundleName();
661 hapInfo.instIndex = innerBundleInfo.GetAppIndex();
662 hapInfo.appIDDesc = innerBundleInfo.GetAppId();
663 hapInfo.dlpType = dlpType;
664 hapInfo.apiVersion = innerBundleInfo.GetBaseApplicationInfo().apiTargetVersion;
665 hapInfo.isSystemApp = innerBundleInfo.IsSystemApp();
666 hapInfo.appDistributionType = innerBundleInfo.GetAppDistributionType();
667 return hapInfo;
668 }
669
670 int32_t BundlePermissionMgr::InitHapToken(const InnerBundleInfo &innerBundleInfo, const int32_t userId,
671 const int32_t dlpType, Security::AccessToken::AccessTokenIDEx& tokenIdeEx)
672 {
673 LOG_I(BMS_TAG_DEFAULT, "start, init hap token bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
674 AccessToken::HapInfoParams hapInfo = CreateHapInfoParams(innerBundleInfo, userId, dlpType);
675 AccessToken::HapPolicyParams hapPolicy = CreateHapPolicyParam(innerBundleInfo);
676 auto ret = AccessToken::AccessTokenKit::InitHapToken(hapInfo, hapPolicy, tokenIdeEx);
677 if (ret != AccessToken::AccessTokenKitRet::RET_SUCCESS) {
678 LOG_E(BMS_TAG_DEFAULT, "InitHapToken failed, bundleName:%{public}s errCode:%{public}d",
679 innerBundleInfo.GetBundleName().c_str(), ret);
680 return ret;
681 }
682 LOG_I(BMS_TAG_DEFAULT, "bundleName: %{public}s tokenId:%{public}u", innerBundleInfo.GetBundleName().c_str(),
683 tokenIdeEx.tokenIdExStruct.tokenID);
684 return ERR_OK;
685 }
686
687 int32_t BundlePermissionMgr::UpdateHapToken(
688 Security::AccessToken::AccessTokenIDEx& tokenIdeEx, const InnerBundleInfo &innerBundleInfo)
689 {
690 LOG_NOFUNC_I(BMS_TAG_DEFAULT, "start UpdateHapToken -n %{public}s", innerBundleInfo.GetBundleName().c_str());
691 AccessToken::UpdateHapInfoParams updateHapInfoParams;
692 updateHapInfoParams.appIDDesc = innerBundleInfo.GetAppId();
693 updateHapInfoParams.apiVersion = innerBundleInfo.GetBaseApplicationInfo().apiTargetVersion;
694 updateHapInfoParams.isSystemApp = innerBundleInfo.IsSystemApp();
695 updateHapInfoParams.appDistributionType = innerBundleInfo.GetAppDistributionType();
696
697 AccessToken::HapPolicyParams hapPolicy = CreateHapPolicyParam(innerBundleInfo);
698
699 auto ret = AccessToken::AccessTokenKit::UpdateHapToken(tokenIdeEx, updateHapInfoParams, hapPolicy);
700 if (ret != AccessToken::AccessTokenKitRet::RET_SUCCESS) {
701 LOG_NOFUNC_E(BMS_TAG_DEFAULT, "UpdateHapToken failed, bundleName:%{public}s errCode:%{public}d",
702 innerBundleInfo.GetBundleName().c_str(), ret);
703 return ret;
704 }
705 LOG_NOFUNC_I(BMS_TAG_DEFAULT, "end UpdateHapToken");
706 return ERR_OK;
707 }
708 } // namespace AppExecFwk
709 } // namespace OHOS