1eace7efcSopenharmony_ci/* 2eace7efcSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3eace7efcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4eace7efcSopenharmony_ci * you may not use this file except in compliance with the License. 5eace7efcSopenharmony_ci * You may obtain a copy of the License at 6eace7efcSopenharmony_ci * 7eace7efcSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8eace7efcSopenharmony_ci * 9eace7efcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10eace7efcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11eace7efcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12eace7efcSopenharmony_ci * See the License for the specific language governing permissions and 13eace7efcSopenharmony_ci * limitations under the License. 14eace7efcSopenharmony_ci */ 15eace7efcSopenharmony_ci 16eace7efcSopenharmony_ci#include "attachabilitythread_fuzzer.h" 17eace7efcSopenharmony_ci 18eace7efcSopenharmony_ci#include <cstddef> 19eace7efcSopenharmony_ci#include <cstdint> 20eace7efcSopenharmony_ci 21eace7efcSopenharmony_ci#include "ability_manager_client.h" 22eace7efcSopenharmony_ci#include "ability_connect_manager.h" 23eace7efcSopenharmony_ci#include "ability_record.h" 24eace7efcSopenharmony_ci#include "ability_scheduler_stub.h" 25eace7efcSopenharmony_ci#include "data_ability_manager.h" 26eace7efcSopenharmony_ci 27eace7efcSopenharmony_ciusing namespace OHOS::AAFwk; 28eace7efcSopenharmony_ciusing namespace OHOS::AppExecFwk; 29eace7efcSopenharmony_ci 30eace7efcSopenharmony_cinamespace OHOS { 31eace7efcSopenharmony_cinamespace { 32eace7efcSopenharmony_ciconstexpr size_t FOO_MAX_LEN = 1024; 33eace7efcSopenharmony_ciconstexpr size_t U32_AT_SIZE = 4; 34eace7efcSopenharmony_ciconstexpr int32_t UID_TEST = 100; 35eace7efcSopenharmony_ciconstexpr int OFFSET_ZERO = 24; 36eace7efcSopenharmony_ci} 37eace7efcSopenharmony_ciclass AbilitySchedulerFuzzTest : public AbilitySchedulerStub { 38eace7efcSopenharmony_cipublic: 39eace7efcSopenharmony_ci AbilitySchedulerFuzzTest() = default; 40eace7efcSopenharmony_ci virtual ~AbilitySchedulerFuzzTest() 41eace7efcSopenharmony_ci {}; 42eace7efcSopenharmony_ci bool ScheduleAbilityTransaction(const Want& want, const LifeCycleStateInfo& targetState, 43eace7efcSopenharmony_ci sptr<SessionInfo> sessionInfo = nullptr) override 44eace7efcSopenharmony_ci { 45eace7efcSopenharmony_ci return true; 46eace7efcSopenharmony_ci } 47eace7efcSopenharmony_ci void ScheduleShareData(const int32_t &uniqueId) override 48eace7efcSopenharmony_ci {} 49eace7efcSopenharmony_ci void SendResult(int requestCode, int resultCode, const Want& resultWant) override 50eace7efcSopenharmony_ci {} 51eace7efcSopenharmony_ci void ScheduleConnectAbility(const Want& want) override 52eace7efcSopenharmony_ci {} 53eace7efcSopenharmony_ci void ScheduleDisconnectAbility(const Want& want) override 54eace7efcSopenharmony_ci {} 55eace7efcSopenharmony_ci void ScheduleCommandAbility(const Want& want, bool restart, int startId) override 56eace7efcSopenharmony_ci {} 57eace7efcSopenharmony_ci void ScheduleCommandAbilityWindow(const Want &want, const sptr<SessionInfo> &sessionInfo, 58eace7efcSopenharmony_ci WindowCommand winCmd) override 59eace7efcSopenharmony_ci {} 60eace7efcSopenharmony_ci bool SchedulePrepareTerminateAbility() override 61eace7efcSopenharmony_ci { 62eace7efcSopenharmony_ci return false; 63eace7efcSopenharmony_ci } 64eace7efcSopenharmony_ci void ScheduleSaveAbilityState() override 65eace7efcSopenharmony_ci {} 66eace7efcSopenharmony_ci void ScheduleRestoreAbilityState(const PacMap& inState) override 67eace7efcSopenharmony_ci {} 68eace7efcSopenharmony_ci std::vector<std::string> GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter) override 69eace7efcSopenharmony_ci { 70eace7efcSopenharmony_ci return {}; 71eace7efcSopenharmony_ci } 72eace7efcSopenharmony_ci int OpenFile(const Uri& uri, const std::string& mode) override 73eace7efcSopenharmony_ci { 74eace7efcSopenharmony_ci return 0; 75eace7efcSopenharmony_ci } 76eace7efcSopenharmony_ci int OpenRawFile(const Uri& uri, const std::string& mode) override 77eace7efcSopenharmony_ci { 78eace7efcSopenharmony_ci return 0; 79eace7efcSopenharmony_ci } 80eace7efcSopenharmony_ci int Insert(const Uri& uri, const NativeRdb::ValuesBucket& value) override 81eace7efcSopenharmony_ci { 82eace7efcSopenharmony_ci return 0; 83eace7efcSopenharmony_ci } 84eace7efcSopenharmony_ci int Update(const Uri& uri, const NativeRdb::ValuesBucket& value, 85eace7efcSopenharmony_ci const NativeRdb::DataAbilityPredicates& predicates) override 86eace7efcSopenharmony_ci { 87eace7efcSopenharmony_ci return 0; 88eace7efcSopenharmony_ci } 89eace7efcSopenharmony_ci int Delete(const Uri& uri, const NativeRdb::DataAbilityPredicates& predicates) override 90eace7efcSopenharmony_ci { 91eace7efcSopenharmony_ci return 0; 92eace7efcSopenharmony_ci } 93eace7efcSopenharmony_ci std::shared_ptr<AppExecFwk::PacMap> Call( 94eace7efcSopenharmony_ci const Uri& uri, const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap) override 95eace7efcSopenharmony_ci { 96eace7efcSopenharmony_ci return {}; 97eace7efcSopenharmony_ci } 98eace7efcSopenharmony_ci std::shared_ptr<NativeRdb::AbsSharedResultSet> Query(const Uri& uri, 99eace7efcSopenharmony_ci std::vector<std::string>& columns, const NativeRdb::DataAbilityPredicates& predicates) override 100eace7efcSopenharmony_ci { 101eace7efcSopenharmony_ci return {}; 102eace7efcSopenharmony_ci } 103eace7efcSopenharmony_ci std::string GetType(const Uri& uri) override 104eace7efcSopenharmony_ci { 105eace7efcSopenharmony_ci return {}; 106eace7efcSopenharmony_ci } 107eace7efcSopenharmony_ci bool Reload(const Uri& uri, const PacMap& extras) override 108eace7efcSopenharmony_ci { 109eace7efcSopenharmony_ci return true; 110eace7efcSopenharmony_ci } 111eace7efcSopenharmony_ci int BatchInsert(const Uri& uri, const std::vector<NativeRdb::ValuesBucket>& values) override 112eace7efcSopenharmony_ci { 113eace7efcSopenharmony_ci return 0; 114eace7efcSopenharmony_ci } 115eace7efcSopenharmony_ci bool ScheduleRegisterObserver(const Uri& uri, const sptr<IDataAbilityObserver>& dataObserver) override 116eace7efcSopenharmony_ci { 117eace7efcSopenharmony_ci return true; 118eace7efcSopenharmony_ci } 119eace7efcSopenharmony_ci bool ScheduleUnregisterObserver(const Uri& uri, const sptr<IDataAbilityObserver>& dataObserver) override 120eace7efcSopenharmony_ci { 121eace7efcSopenharmony_ci return true; 122eace7efcSopenharmony_ci } 123eace7efcSopenharmony_ci bool ScheduleNotifyChange(const Uri& uri) override 124eace7efcSopenharmony_ci { 125eace7efcSopenharmony_ci return true; 126eace7efcSopenharmony_ci } 127eace7efcSopenharmony_ci Uri NormalizeUri(const Uri& uri) override 128eace7efcSopenharmony_ci { 129eace7efcSopenharmony_ci return Uri{ "abilityschedulerstub" }; 130eace7efcSopenharmony_ci } 131eace7efcSopenharmony_ci 132eace7efcSopenharmony_ci Uri DenormalizeUri(const Uri& uri) override 133eace7efcSopenharmony_ci { 134eace7efcSopenharmony_ci return Uri{ "abilityschedulerstub" }; 135eace7efcSopenharmony_ci } 136eace7efcSopenharmony_ci std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> ExecuteBatch( 137eace7efcSopenharmony_ci const std::vector<std::shared_ptr<AppExecFwk::DataAbilityOperation>>& operations) override 138eace7efcSopenharmony_ci { 139eace7efcSopenharmony_ci return {}; 140eace7efcSopenharmony_ci } 141eace7efcSopenharmony_ci void ContinueAbility(const std::string& deviceId, uint32_t versionCode) override 142eace7efcSopenharmony_ci {} 143eace7efcSopenharmony_ci void NotifyContinuationResult(int32_t result) override 144eace7efcSopenharmony_ci {} 145eace7efcSopenharmony_ci void DumpAbilityInfo(const std::vector<std::string>& params, std::vector<std::string>& info) override 146eace7efcSopenharmony_ci {} 147eace7efcSopenharmony_ci void UpdateSessionToken(sptr<IRemoteObject> sessionToken) override 148eace7efcSopenharmony_ci {} 149eace7efcSopenharmony_ci void OnExecuteIntent(const Want &want) override 150eace7efcSopenharmony_ci {} 151eace7efcSopenharmony_ci int CreateModalUIExtension(const Want &want) override 152eace7efcSopenharmony_ci { 153eace7efcSopenharmony_ci return 0; 154eace7efcSopenharmony_ci } 155eace7efcSopenharmony_ci void CallRequest() override 156eace7efcSopenharmony_ci { 157eace7efcSopenharmony_ci return; 158eace7efcSopenharmony_ci } 159eace7efcSopenharmony_ci}; 160eace7efcSopenharmony_cisptr<Token> GetFuzzAbilityToken(AbilityType type) 161eace7efcSopenharmony_ci{ 162eace7efcSopenharmony_ci sptr<Token> token = nullptr; 163eace7efcSopenharmony_ci 164eace7efcSopenharmony_ci AbilityRequest abilityRequest; 165eace7efcSopenharmony_ci abilityRequest.uid = UID_TEST; 166eace7efcSopenharmony_ci abilityRequest.appInfo.bundleName = "com.example.fuzzTest"; 167eace7efcSopenharmony_ci abilityRequest.abilityInfo.name = "MainAbility"; 168eace7efcSopenharmony_ci abilityRequest.abilityInfo.type = type; 169eace7efcSopenharmony_ci std::shared_ptr<AbilityRecord> abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest); 170eace7efcSopenharmony_ci if (abilityRecord) { 171eace7efcSopenharmony_ci token = abilityRecord->GetToken(); 172eace7efcSopenharmony_ci } 173eace7efcSopenharmony_ci 174eace7efcSopenharmony_ci return token; 175eace7efcSopenharmony_ci} 176eace7efcSopenharmony_ciuint32_t GetU32Data(const char* ptr) 177eace7efcSopenharmony_ci{ 178eace7efcSopenharmony_ci // convert fuzz input data to an integer 179eace7efcSopenharmony_ci return (ptr[0] << OFFSET_ZERO) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]; 180eace7efcSopenharmony_ci} 181eace7efcSopenharmony_cibool DoSomethingInterestingWithMyAPI(const char* data, size_t size) 182eace7efcSopenharmony_ci{ 183eace7efcSopenharmony_ci auto abilitymgr = AbilityManagerClient::GetInstance(); 184eace7efcSopenharmony_ci int userId = static_cast<int>(GetU32Data(data)); 185eace7efcSopenharmony_ci std::shared_ptr<AbilityConnectManager> connectManager = std::make_shared<AbilityConnectManager>(userId); 186eace7efcSopenharmony_ci if (!connectManager) { 187eace7efcSopenharmony_ci return false; 188eace7efcSopenharmony_ci } 189eace7efcSopenharmony_ci std::shared_ptr<DataAbilityManager> dataManager = std::make_shared<DataAbilityManager>(); 190eace7efcSopenharmony_ci if (!dataManager) { 191eace7efcSopenharmony_ci return false; 192eace7efcSopenharmony_ci } 193eace7efcSopenharmony_ci sptr<IAbilityScheduler> scheduler = new AbilitySchedulerFuzzTest(); 194eace7efcSopenharmony_ci if (!abilitymgr) { 195eace7efcSopenharmony_ci return false; 196eace7efcSopenharmony_ci } 197eace7efcSopenharmony_ci 198eace7efcSopenharmony_ci // get token 199eace7efcSopenharmony_ci sptr<IRemoteObject> token = GetFuzzAbilityToken(AbilityType::PAGE); 200eace7efcSopenharmony_ci if (!token) { 201eace7efcSopenharmony_ci std::cout << "Get ability token failed." << std::endl; 202eace7efcSopenharmony_ci return false; 203eace7efcSopenharmony_ci } 204eace7efcSopenharmony_ci 205eace7efcSopenharmony_ci // get serviceToken 206eace7efcSopenharmony_ci sptr<IRemoteObject> serviceToken = GetFuzzAbilityToken(AbilityType::SERVICE); 207eace7efcSopenharmony_ci if (!serviceToken) { 208eace7efcSopenharmony_ci std::cout << "Get service ability token failed." << std::endl; 209eace7efcSopenharmony_ci return false; 210eace7efcSopenharmony_ci } 211eace7efcSopenharmony_ci 212eace7efcSopenharmony_ci // get dataToken 213eace7efcSopenharmony_ci sptr<IRemoteObject> dataToken = GetFuzzAbilityToken(AbilityType::DATA); 214eace7efcSopenharmony_ci if (!dataToken) { 215eace7efcSopenharmony_ci std::cout << "Get data ability token failed." << std::endl; 216eace7efcSopenharmony_ci return false; 217eace7efcSopenharmony_ci } 218eace7efcSopenharmony_ci 219eace7efcSopenharmony_ci if (connectManager) { 220eace7efcSopenharmony_ci connectManager->AttachAbilityThreadLocked(scheduler, serviceToken); 221eace7efcSopenharmony_ci } 222eace7efcSopenharmony_ci 223eace7efcSopenharmony_ci if (dataManager) { 224eace7efcSopenharmony_ci dataManager->AttachAbilityThread(scheduler, dataToken); 225eace7efcSopenharmony_ci } 226eace7efcSopenharmony_ci 227eace7efcSopenharmony_ci if (abilitymgr->AttachAbilityThread(scheduler, token) != 0) { 228eace7efcSopenharmony_ci return false; 229eace7efcSopenharmony_ci } 230eace7efcSopenharmony_ci 231eace7efcSopenharmony_ci return true; 232eace7efcSopenharmony_ci} 233eace7efcSopenharmony_ci} 234eace7efcSopenharmony_ci 235eace7efcSopenharmony_ci/* Fuzzer entry point */ 236eace7efcSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 237eace7efcSopenharmony_ci{ 238eace7efcSopenharmony_ci /* Run your code on data */ 239eace7efcSopenharmony_ci if (data == nullptr) { 240eace7efcSopenharmony_ci std::cout << "invalid data" << std::endl; 241eace7efcSopenharmony_ci return 0; 242eace7efcSopenharmony_ci } 243eace7efcSopenharmony_ci 244eace7efcSopenharmony_ci /* Validate the length of size */ 245eace7efcSopenharmony_ci if (size > OHOS::FOO_MAX_LEN || size < OHOS::U32_AT_SIZE) { 246eace7efcSopenharmony_ci return 0; 247eace7efcSopenharmony_ci } 248eace7efcSopenharmony_ci 249eace7efcSopenharmony_ci char* ch = (char*)malloc(size + 1); 250eace7efcSopenharmony_ci if (ch == nullptr) { 251eace7efcSopenharmony_ci std::cout << "malloc failed." << std::endl; 252eace7efcSopenharmony_ci return 0; 253eace7efcSopenharmony_ci } 254eace7efcSopenharmony_ci 255eace7efcSopenharmony_ci (void)memset_s(ch, size + 1, 0x00, size + 1); 256eace7efcSopenharmony_ci if (memcpy_s(ch, size, data, size) != EOK) { 257eace7efcSopenharmony_ci std::cout << "copy failed." << std::endl; 258eace7efcSopenharmony_ci free(ch); 259eace7efcSopenharmony_ci ch = nullptr; 260eace7efcSopenharmony_ci return 0; 261eace7efcSopenharmony_ci } 262eace7efcSopenharmony_ci 263eace7efcSopenharmony_ci OHOS::DoSomethingInterestingWithMyAPI(ch, size); 264eace7efcSopenharmony_ci free(ch); 265eace7efcSopenharmony_ci ch = nullptr; 266eace7efcSopenharmony_ci return 0; 267eace7efcSopenharmony_ci} 268eace7efcSopenharmony_ci 269