1 /*
2 * Copyright (c) 2022 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 "createosaccount_fuzzer.h"
17
18 #include <cstdint>
19 #include <string>
20 #include <vector>
21 #include "os_account_manager.h"
22 #include "account_log_wrapper.h"
23 #include "fuzz_data.h"
24 #undef private
25 #include "os_account_constants.h"
26 #include "securec.h"
27
28 using namespace std;
29 using namespace OHOS::AccountSA;
30 namespace OHOS {
31 const int CONSTANTS_NUMBER_FIVE = 5;
32 const int LIST_NUMBER_LIMIT = 1002;
33 const int HAP_NAME_LENGTH_LIMIT = 1000;
34 const uint8_t *g_baseFuzzData = nullptr;
35 size_t g_baseFuzzSize = 0;
36 size_t g_baseFuzzPos;
37
GetData()38 template <class T> T GetData()
39 {
40 T object{};
41 size_t objectSize = sizeof(object);
42 if (g_baseFuzzData == nullptr || objectSize > g_baseFuzzSize - g_baseFuzzPos) {
43 return object;
44 }
45 errno_t ret = memcpy_s(&object, objectSize, g_baseFuzzData + g_baseFuzzPos, objectSize);
46 if (ret != EOK) {
47 return {};
48 }
49 g_baseFuzzPos += objectSize;
50 return object;
51 }
52
CreateOsAccountWithShortNameFuzzTest(const uint8_t * data,size_t size)53 bool CreateOsAccountWithShortNameFuzzTest(const uint8_t* data, size_t size)
54 {
55 bool result = false;
56 if ((data != nullptr) && (size != 0)) {
57 FuzzData fuzzData(data, size);
58 OsAccountInfo osAccountInfoOne;
59 OsAccountType testType = static_cast<OsAccountType>(fuzzData.GetData<uint32_t>() % CONSTANTS_NUMBER_FIVE);
60 std::string accountName(fuzzData.GenerateRandomString());
61 std::string shortName(fuzzData.GenerateRandomString());
62 result = OsAccountManager::CreateOsAccount(accountName, shortName, testType, osAccountInfoOne);
63 if (result == ERR_OK) {
64 ACCOUNT_LOGI("CreateOsAccountWithShortNameFuzzTest RemoveOsAccount");
65 OsAccountManager::RemoveOsAccount(osAccountInfoOne.GetLocalId());
66 }
67 uint32_t listSize = fuzzData.GetData<uint32_t>();
68 CreateOsAccountOptions options;
69 for (uint32_t i = 0; i < listSize % LIST_NUMBER_LIMIT; i++) {
70 uint32_t hapNameSize = fuzzData.GetData<uint32_t>();
71 std::string hapName(fuzzData.GetStringFromData(0, hapNameSize % HAP_NAME_LENGTH_LIMIT));
72 options.disallowedHapList.push_back(hapName);
73 }
74 result = OsAccountManager::CreateOsAccount(accountName, shortName, testType, options, osAccountInfoOne);
75 if (result == ERR_OK) {
76 ACCOUNT_LOGI("CreateOsAccountWithShortNameFuzzTest RemoveOsAccount");
77 OsAccountManager::RemoveOsAccount(osAccountInfoOne.GetLocalId());
78 }
79 }
80 return result;
81 }
82
CreateOsAccountFuzzTest(const uint8_t * data,size_t size)83 bool CreateOsAccountFuzzTest(const uint8_t* data, size_t size)
84 {
85 bool result = false;
86 if ((data != nullptr) && (size != 0)) {
87 FuzzData fuzzData(data, size);
88 OsAccountInfo osAccountInfoOne;
89 OsAccountType testType = static_cast<OsAccountType>(fuzzData.GetData<uint32_t>() % CONSTANTS_NUMBER_FIVE);
90 std::string accountName(fuzzData.GenerateRandomString());
91 result = OsAccountManager::CreateOsAccount(accountName, testType, osAccountInfoOne);
92 if (result == ERR_OK) {
93 ACCOUNT_LOGI("CreateOsAccountFuzzTest RemoveOsAccount");
94 OsAccountManager::RemoveOsAccount(osAccountInfoOne.GetLocalId());
95 }
96 }
97 return result;
98 }
99
CreateOsAccountForDomainFuzzTest(const uint8_t * data,size_t size)100 bool CreateOsAccountForDomainFuzzTest(const uint8_t* data, size_t size)
101 {
102 bool result = false;
103 if ((data != nullptr) && (size != 0)) {
104 FuzzData fuzzData(data, size);
105 std::string accountName(fuzzData.GenerateRandomString());
106 std::string domain(fuzzData.GenerateRandomString());
107 DomainAccountInfo domainInfo(accountName, domain);
108 OsAccountType testType = static_cast<OsAccountType>(fuzzData.GetData<uint32_t>() % CONSTANTS_NUMBER_FIVE);
109 OsAccountInfo osAccountInfo;
110 result = OsAccountManager::CreateOsAccountForDomain(testType, domainInfo, nullptr);
111 if (result == ERR_OK) {
112 ACCOUNT_LOGI("CreateOsAccountForDomainFuzzTest RemoveOsAccount");
113 OsAccountManager::RemoveOsAccount(osAccountInfo.GetLocalId());
114 }
115 }
116 return result;
117 }
118
UpdateOsAccountWithFullInfoFuzzTest(const uint8_t * data,size_t size)119 bool UpdateOsAccountWithFullInfoFuzzTest(const uint8_t* data, size_t size)
120 {
121 bool result = false;
122 if ((data != nullptr) && (size != 0)) {
123 FuzzData fuzzData(data, size);
124 OsAccountInfo osAccountInfo;
125 osAccountInfo.SetLocalName(fuzzData.GenerateRandomString());
126 osAccountInfo.SetLocalId(fuzzData.GetData<int64_t>());
127 osAccountInfo.SetSerialNumber(fuzzData.GetData<int64_t>());
128 osAccountInfo.SetCreateTime(fuzzData.GetData<int64_t>());
129 osAccountInfo.SetLastLoginTime(fuzzData.GetData<int64_t>());
130 result = OsAccountManager::UpdateOsAccountWithFullInfo(osAccountInfo);
131 if (result == ERR_OK) {
132 ACCOUNT_LOGI("CreateOsAccountFuzzTest RemoveOsAccount");
133 OsAccountManager::RemoveOsAccount(osAccountInfo.GetLocalId());
134 }
135 }
136 return result;
137 }
138
CreateOsAccountWithFullInfoFuzzTest(const uint8_t * data,size_t size)139 bool CreateOsAccountWithFullInfoFuzzTest(const uint8_t* data, size_t size)
140 {
141 bool result = false;
142 if ((data != nullptr) && (size != 0)) {
143 FuzzData fuzzData(data, size);
144 OsAccountInfo osAccountInfo;
145 osAccountInfo.SetLocalName(fuzzData.GenerateRandomString());
146 osAccountInfo.SetLocalId(fuzzData.GetData<int64_t>());
147 osAccountInfo.SetSerialNumber(fuzzData.GetData<int64_t>());
148 osAccountInfo.SetCreateTime(fuzzData.GetData<int64_t>());
149 osAccountInfo.SetLastLoginTime(fuzzData.GetData<int64_t>());
150 result = OsAccountManager::CreateOsAccountWithFullInfo(osAccountInfo);
151 if (result == ERR_OK) {
152 ACCOUNT_LOGI("CreateOsAccountFuzzTest RemoveOsAccount");
153 OsAccountManager::RemoveOsAccount(osAccountInfo.GetLocalId());
154 }
155 }
156 return result;
157 }
158
CovWithoutParamFunctionFuzzTest(const uint8_t * data,size_t size)159 bool CovWithoutParamFunctionFuzzTest(const uint8_t* data, size_t size)
160 {
161 bool result = false;
162 if ((data != nullptr) && (size != 0)) {
163 std::string nameStr;
164 std::vector<ForegroundOsAccount> accounts;
165 std::vector<int32_t> localIds;
166 OsAccountManager::GetOsAccountShortName(nameStr);
167 OsAccountManager::GetOsAccountName(nameStr);
168 OsAccountManager::GetForegroundOsAccounts(accounts);
169 OsAccountManager::GetBackgroundOsAccountLocalIds(localIds);
170 }
171 return result;
172 }
173
CheckOsAccountConstraintEnabledFuzzTest(const uint8_t * data,size_t size)174 bool CheckOsAccountConstraintEnabledFuzzTest(const uint8_t* data, size_t size)
175 {
176 bool result = false;
177 if ((data != nullptr) && (size != 0)) {
178 FuzzData fuzzData(data, size);
179 int32_t userId = fuzzData.GetData<int32_t>();
180 std::string constraintStr(fuzzData.GenerateRandomString());
181 bool isEnabled = false;
182 result = OsAccountManager::CheckOsAccountConstraintEnabled(userId, constraintStr, isEnabled);
183 }
184 return result;
185 }
186 } // namespace
187
188 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)189 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
190 {
191 /* Run your code on data */
192 OHOS::CreateOsAccountWithShortNameFuzzTest(data, size);
193 OHOS::CreateOsAccountFuzzTest(data, size);
194 OHOS::CreateOsAccountForDomainFuzzTest(data, size);
195 OHOS::UpdateOsAccountWithFullInfoFuzzTest(data, size);
196 OHOS::CreateOsAccountWithFullInfoFuzzTest(data, size);
197 OHOS::CovWithoutParamFunctionFuzzTest(data, size);
198 OHOS::CheckOsAccountConstraintEnabledFuzzTest(data, size);
199 return 0;
200 }
201
202