diff --git a/interfaces/innerkits/accesstoken/include/access_token.h b/interfaces/innerkits/accesstoken/include/access_token.h index 44130adeae4ca8f5dda9f505a22fbd991b37b5d7..b2d3243291840480c2240ed00bccaf32637d8643 100644 --- a/interfaces/innerkits/accesstoken/include/access_token.h +++ b/interfaces/innerkits/accesstoken/include/access_token.h @@ -24,6 +24,8 @@ typedef unsigned int AccessTokenAttr; static const int DEFAULT_TOKEN_VERSION = 1; static const int DEFAULT_PERMISSION_FLAGS = 0; static const int FIRSTCALLER_TOKENID_DEFAULT = 0; +static const int MAX_PERMISSION_SIZE = 1000; +static const int MAX_NATIVE_TOKEN_INFO_SIZE = 20480; enum AccessTokenKitRet { RET_FAILED = -1, diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp b/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp index c6e1a5a0031def3059da18e4833f7923de59dc44..4f371c6f691e6f87aa08d9c379dc53698f33116c 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp @@ -158,6 +158,10 @@ int AccessTokenManagerProxy::GetDefPermissions(AccessTokenID tokenID, } int32_t size = reply.ReadInt32(); + if (size > MAX_PERMISSION_SIZE) { + ACCESSTOKEN_LOG_ERROR(LABEL, "size = %{public}d get from request is invalid", size); + return RET_FAILED; + } for (int i = 0; i < size; i++) { sptr permissionDef = reply.ReadParcelable(); if (permissionDef != nullptr) { @@ -198,6 +202,10 @@ int AccessTokenManagerProxy::GetReqPermissions( } int32_t size = reply.ReadInt32(); + if (size > MAX_PERMISSION_SIZE) { + ACCESSTOKEN_LOG_ERROR(LABEL, "size = %{public}d get from request is invalid", size); + return RET_FAILED; + } for (int i = 0; i < size; i++) { sptr permissionReq = reply.ReadParcelable(); if (permissionReq != nullptr) { @@ -697,6 +705,10 @@ int AccessTokenManagerProxy::GetAllNativeTokenInfo(std::vector MAX_NATIVE_TOKEN_INFO_SIZE) { + ACCESSTOKEN_LOG_ERROR(LABEL, "size = %{public}d get from request is invalid", size); + return RET_FAILED; + } for (int i = 0; i < size; i++) { sptr nativeResult = reply.ReadParcelable(); if (nativeResult != nullptr) { diff --git a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp index c92ab76485744564f29ecaa45d6d85eb61e1460f..0d5c8916a84de923121a3a7b09c64f4b48e97dd5 100644 --- a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp +++ b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp @@ -184,7 +184,11 @@ void AccessTokenManagerStub::AllocHapTokenInner(MessageParcel& data, MessageParc sptr hapInfoParcel = data.ReadParcelable(); sptr hapPolicyParcel = data.ReadParcelable(); - + if (hapInfoParcel == nullptr || hapPolicyParcel == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "read hapPolicyParcel or hapInfoParcel fail"); + reply.WriteInt32(RET_FAILED); + return; + } res = this->AllocHapToken(*hapInfoParcel, *hapPolicyParcel); reply.WriteUint64(res.tokenIDEx); } @@ -245,14 +249,18 @@ void AccessTokenManagerStub::AllocLocalTokenIDInner(MessageParcel& data, Message void AccessTokenManagerStub::UpdateHapTokenInner(MessageParcel& data, MessageParcel& reply) { if (!IsAuthorizedCalling()) { - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, permission denied", __func__); + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s called, permission denied", __func__); reply.WriteInt32(RET_FAILED); return; } AccessTokenID tokenID = data.ReadUint32(); std::string appIDDesc = data.ReadString(); sptr policyParcel = data.ReadParcelable(); - + if (policyParcel == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "policyParcel read faild"); + reply.WriteInt32(RET_FAILED); + return; + } int32_t result = this->UpdateHapToken(tokenID, appIDDesc, *policyParcel); reply.WriteInt32(result); } @@ -327,6 +335,11 @@ void AccessTokenManagerStub::SetRemoteHapTokenInfoInner(MessageParcel& data, Mes } std::string deviceID = data.ReadString(); sptr hapTokenParcel = data.ReadParcelable(); + if (hapTokenParcel == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "hapTokenParcel read faild"); + reply.WriteInt32(RET_FAILED); + return; + } int result = this->SetRemoteHapTokenInfo(deviceID, *hapTokenParcel); reply.WriteInt32(result); } @@ -342,9 +355,18 @@ void AccessTokenManagerStub::SetRemoteNativeTokenInfoInner(MessageParcel& data, std::vector nativeTokenInfoParcel; uint32_t size = data.ReadUint32(); - + if (size > MAX_NATIVE_TOKEN_INFO_SIZE) { + ACCESSTOKEN_LOG_ERROR(LABEL, "size %{public}u is invalid", size); + reply.WriteInt32(RET_FAILED); + return; + } for (uint32_t i = 0; i < size; i++) { sptr nativeParcel = data.ReadParcelable(); + if (nativeParcel == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "nativeParcel read faild"); + reply.WriteInt32(RET_FAILED); + return; + } nativeTokenInfoParcel.emplace_back(*nativeParcel); }