1 /*
2  * Copyright (c) 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 "common_fuzzer.h"
17 
18 #include <system_ability_definition.h>
19 
20 #define protected public
21 #define private public
22 #include "enterprise_device_mgr_ability.h"
23 #undef protected
24 #undef private
25 #ifdef OS_ACCOUNT_EDM_ENABLE
26 #include "add_os_account_plugin.h"
27 #endif
28 #include "allowed_bluetooth_devices_plugin.h"
29 #include "allowed_install_bundles_plugin.h"
30 #include "allowed_usb_devices_plugin.h"
31 #include "disable_bluetooth_plugin.h"
32 #include "disable_hdc_plugin.h"
33 #include "disable_microphone_plugin.h"
34 #include "disable_printer_plugin.h"
35 #include "disable_usb_plugin.h"
36 #include "disabled_network_interface_plugin.h"
37 #ifdef OS_ACCOUNT_EDM_ENABLE
38 #include "disallow_add_local_account_plugin.h"
39 #include "disallow_add_os_account_by_user_plugin.h"
40 #endif
41 #include "disallow_modify_datetime_plugin.h"
42 #include "disallowed_install_bundles_plugin.h"
43 #include "disallowed_running_bundles_plugin.h"
44 #include "disallowed_uninstall_bundles_plugin.h"
45 #include "domain_filter_rule_plugin.h"
46 #include "fingerprint_auth_plugin.h"
47 #include "firewall_rule_plugin.h"
48 #include "func_code.h"
49 #include "get_all_network_interfaces_plugin.h"
50 #include "get_bluetooth_info_plugin.h"
51 #include "get_device_encryption_status_plugin.h"
52 #include "get_device_info_plugin.h"
53 #include "get_display_version_plugin.h"
54 #include "get_ip_address_plugin.h"
55 #include "get_mac_plugin.h"
56 #include "get_security_patch_tag_plugin.h"
57 #include "global_proxy_plugin.h"
58 #include "ienterprise_device_mgr.h"
59 #include "install_plugin.h"
60 #include "iptables_rule_plugin.h"
61 #include "is_wifi_active_plugin.h"
62 #include "location_policy_plugin.h"
63 #include "lock_screen_plugin.h"
64 #include "manage_auto_start_apps_plugin.h"
65 #include "ntp_server_plugin.h"
66 #include "operate_device_plugin.h"
67 #include "password_policy_plugin.h"
68 #include "power_policy_plugin.h"
69 #include "reset_factory_plugin.h"
70 #include "screen_off_time_plugin.h"
71 #include "set_browser_policies_plugin.h"
72 #include "set_wifi_disabled_plugin.h"
73 #include "set_wifi_profile_plugin.h"
74 #include "uninstall_plugin.h"
75 #include "usb_read_only_plugin.h"
76 #include "user_cert_plugin.h"
77 #include "utils.h"
78 
79 namespace OHOS {
80 namespace EDM {
81 constexpr int32_t NUM_24 = 24;
82 constexpr int32_t NUM_16 = 16;
83 constexpr int32_t NUM_8 = 8;
84 constexpr int32_t NUM_INDEX_ZERO = 0;
85 constexpr int32_t NUM_INDEX_FIRST = 1;
86 constexpr int32_t NUM_INDEX_SECOND = 2;
87 constexpr int32_t NUM_INDEX_THIRD = 3;
88 constexpr int32_t BYTE_SIZE = 8;
89 constexpr int32_t MAX_STRING_SIZE = 1024;
90 #ifdef OS_ACCOUNT_EDM_ENABLE
91 const bool REGISTER_ADD_OS_ACCOUNT_PLUGIN = PluginManager::GetInstance()->AddPlugin(AddOsAccountPlugin::GetPlugin());
92 #endif
93 const bool REGISTER_ALLOWED_BLUETOOTH_DEVICES_PLUGIN =
94     PluginManager::GetInstance()->AddPlugin(AllowedBluetoothDevicesPlugin::GetPlugin());
95 const bool REGISTER_ALLOWED_INSTALL_BUNDLES_PLUGIN =
96     PluginManager::GetInstance()->AddPlugin(AllowedInstallBundlesPlugin::GetPlugin());
97 const bool REGISTER_ALLOW_USB_DEVICES_PLUGIN =
98     PluginManager::GetInstance()->AddPlugin(AllowUsbDevicesPlugin::GetPlugin());
99 const bool REGISTER_DISABLE_BLUETOOTH_PLUGIN =
100     PluginManager::GetInstance()->AddPlugin(DisableBluetoothPlugin::GetPlugin());
101 const bool REGISTER_DISABLE_HDC_PLUGIN = PluginManager::GetInstance()->AddPlugin(DisableHdcPlugin::GetPlugin());
102 const bool REGISTER_DISABLE_MICROPHONE_PLUGIN =
103     PluginManager::GetInstance()->AddPlugin(DisableMicrophonePlugin::GetPlugin());
104 const bool REGISTER_DISABLE_PRINTER_PLUGIN = PluginManager::GetInstance()->AddPlugin(DisablePrinterPlugin::GetPlugin());
105 const bool REGISTER_DISABLE_USB_PLUGIN = PluginManager::GetInstance()->AddPlugin(DisableUsbPlugin::GetPlugin());
106 const bool REGISTER_DISABLED_NETWORK_INTERFACE_PLUGIN =
107     PluginManager::GetInstance()->AddPlugin(DisabledNetworkInterfacePlugin::GetPlugin());
108 #ifdef OS_ACCOUNT_EDM_ENABLE
109 const bool REGISTER_DISALLOW_ADD_LOCAL_ACCOUNT_PLUGIN =
110     PluginManager::GetInstance()->AddPlugin(DisallowAddLocalAccountPlugin::GetPlugin());
111 const bool REGISTER_DISALLOW_ADD_OS_ACCOUNT_BY_USER_PLUGIN =
112     PluginManager::GetInstance()->AddPlugin(DisallowAddOsAccountByUserPlugin::GetPlugin());
113 #endif
114 const bool REGISTER_DISALL_MODIFY_DATE_TIME_PLUGIN =
115     PluginManager::GetInstance()->AddPlugin(DisallModifyDateTimePlugin::GetPlugin());
116 const bool REGISTER_DISALLOWED_INSTALL_BUNDLES_PLUGIN =
117     PluginManager::GetInstance()->AddPlugin(DisallowedInstallBundlesPlugin::GetPlugin());
118 const bool REGISTER_DISALLOWED_RUNNING_BUNDLES_PLUGIN =
119     PluginManager::GetInstance()->AddPlugin(DisallowedRunningBundlesPlugin::GetPlugin());
120 const bool REGISTER_DISALLOWED_UNINSTALL_BUNDLES_PLUGIN =
121     PluginManager::GetInstance()->AddPlugin(DisallowedUninstallBundlesPlugin::GetPlugin());
122 const bool REGISTER_DOMAIN_FILTER_RULE_PLUGIN =
123     PluginManager::GetInstance()->AddPlugin(DomainFilterRulePlugin::GetPlugin());
124 #ifdef USERIAM_EDM_ENABLE
125 const bool REGISTER_FINGER_PRINT_AUTH_PLUGIN =
126     PluginManager::GetInstance()->AddPlugin(std::make_shared<FingerprintAuthPlugin>());
127 const bool REGISTER_PASSWORD_POLICY_PLUGIN = PluginManager::GetInstance()->AddPlugin(PasswordPolicyPlugin::GetPlugin());
128 #endif
129 const bool REGISTER_FIREWALL_RULE_PLUGIN = PluginManager::GetInstance()->AddPlugin(FirewallRulePlugin::GetPlugin());
130 const bool REGISTER_GET_ALL_NETWORK_INTERFACES_PLUGIN =
131     PluginManager::GetInstance()->AddPlugin(GetAllNetworkInterfacesPlugin::GetPlugin());
132 const bool REGISTER_GET_BLUETOOTH_INFO_PLUGIN =
133     PluginManager::GetInstance()->AddPlugin(GetBluetoothInfoPlugin::GetPlugin());
134 const bool REGISTER_GET_DEVICE_ENCRYPTION_STATUS_PLUGIN =
135     PluginManager::GetInstance()->AddPlugin(GetDeviceEncryptionStatusPlugin::GetPlugin());
136 const bool REGISTER_GET_DEVICE_INFO_PLUGIN = PluginManager::GetInstance()->AddPlugin(GetDeviceInfoPlugin::GetPlugin());
137 const bool REGISTER_GET_DISPLAY_VERSION_PLUGIN =
138     PluginManager::GetInstance()->AddPlugin(GetDisplayVersionPlugin::GetPlugin());
139 const bool REGISTER_GET_IP_ADDRESS_PLUGIN = PluginManager::GetInstance()->AddPlugin(GetIpAddressPlugin::GetPlugin());
140 const bool REGISTER_GET_MAC_PLUGIN = PluginManager::GetInstance()->AddPlugin(GetMacPlugin::GetPlugin());
141 const bool REGISTER_GET_SECURITY_PATCH_TAG_PLUGIN =
142     PluginManager::GetInstance()->AddPlugin(GetSecurityPatchTagPlugin::GetPlugin());
143 const bool REGISTER_GLOBAL_PROXY_PLUGIN = PluginManager::GetInstance()->AddPlugin(GlobalProxyPlugin::GetPlugin());
144 const bool REGISTER_INSTALL_PLUGIN = PluginManager::GetInstance()->AddPlugin(InstallPlugin::GetPlugin());
145 const bool REGISTER_IPTABLES_RULE_PLUGIN =
146     PluginManager::GetInstance()->AddPlugin(std::make_shared<IptablesRulePlugin>());
147 const bool REGISTER_IS_WIFI_ACTIVE_PLUGIN = PluginManager::GetInstance()->AddPlugin(IsWifiActivePlugin::GetPlugin());
148 const bool REGISTER_LOCATION_POLICY_PLUGIN = PluginManager::GetInstance()->AddPlugin(LocationPolicyPlugin::GetPlugin());
149 const bool REGISTER_LOCK_SCREEN_PLUGIN = PluginManager::GetInstance()->AddPlugin(LockScreenPlugin::GetPlugin());
150 const bool REGISTER_MANAGE_AUTO_START_APPS_PLUGIN =
151     PluginManager::GetInstance()->AddPlugin(ManageAutoStartAppsPlugin::GetPlugin());
152 const bool REGISTER_NTP_SERVER_PLUGIN = PluginManager::GetInstance()->AddPlugin(NTPServerPlugin::GetPlugin());
153 const bool REGISTER_OPERATE_DEVICE_PLUGIN = PluginManager::GetInstance()->AddPlugin(OperateDevicePlugin::GetPlugin());
154 const bool REGISTER_POWER_POLICY_PLUGIN =
155     PluginManager::GetInstance()->AddPlugin(std::make_shared<PowerPolicyPlugin>());
156 const bool REGISTER_RESET_FACTORY_PLUGIN = PluginManager::GetInstance()->AddPlugin(ResetFactoryPlugin::GetPlugin());
157 const bool REGISTER_SCREEN_OFF_TIME_PLUGIN = PluginManager::GetInstance()->AddPlugin(ScreenOffTimePlugin::GetPlugin());
158 const bool REGISTER_SET_BROWSER_POLICIES_PLUGIN =
159     PluginManager::GetInstance()->AddPlugin(std::make_shared<SetBrowserPoliciesPlugin>());
160 const bool REGISTER_SET_WIFI_DISABLED_PLUGIN =
161     PluginManager::GetInstance()->AddPlugin(SetWifiDisabledPlugin::GetPlugin());
162 const bool REGISTER_SET_WIFI_PROFILE_PLUGIN =
163     PluginManager::GetInstance()->AddPlugin(SetWifiProfilePlugin::GetPlugin());
164 const bool REGISTER_UNINSTALL_PLUGIN = PluginManager::GetInstance()->AddPlugin(UninstallPlugin::GetPlugin());
165 const bool REGISTER_USB_READ_ONLY_PLUGIN =
166     PluginManager::GetInstance()->AddPlugin(std::make_shared<UsbReadOnlyPlugin>());
167 const bool REGISTER_USER_CERT_PLUGIN = PluginManager::GetInstance()->AddPlugin(std::make_shared<UserCertPlugin>());
168 
OnRemoteRequestFuzzerTest(uint32_t code, const uint8_t* data, size_t size, MessageParcel& parcel)169 void CommonFuzzer::OnRemoteRequestFuzzerTest(uint32_t code, const uint8_t* data, size_t size, MessageParcel& parcel)
170 {
171     TEST::Utils::SetEdmInitialEnv();
172     sptr<EnterpriseDeviceMgrAbility> enterpriseDeviceMgrAbility = EnterpriseDeviceMgrAbility::GetInstance();
173     enterpriseDeviceMgrAbility->OnStart();
174 
175     MessageParcel reply;
176     MessageOption option;
177 
178     enterpriseDeviceMgrAbility->OnRemoteRequest(code, parcel, reply, option);
179     TEST::Utils::ResetTokenTypeAndUid();
180 }
181 
SetParcelContent(MessageParcel& parcel, const uint8_t* data, size_t size)182 void CommonFuzzer::SetParcelContent(MessageParcel& parcel, const uint8_t* data, size_t size)
183 {
184     AppExecFwk::ElementName admin;
185     admin.SetBundleName("com.example.edmtest");
186     admin.SetAbilityName("com.example.edmtest.EnterpriseAdminAbility");
187     parcel.WriteInterfaceToken(IEnterpriseDeviceMgr::GetDescriptor());
188     parcel.WriteParcelable(&admin);
189     parcel.WriteBuffer(data, size);
190 }
191 
GetU32Data(const uint8_t* ptr)192 uint32_t CommonFuzzer::GetU32Data(const uint8_t* ptr)
193 {
194     return (ptr[NUM_INDEX_ZERO] << NUM_24) | (ptr[NUM_INDEX_FIRST] << NUM_16) | (ptr[NUM_INDEX_SECOND] << NUM_8) |
195         ptr[NUM_INDEX_THIRD];
196 }
197 
GetU32Data(const uint8_t* ptr, int32_t& pos, size_t size)198 int32_t CommonFuzzer::GetU32Data(const uint8_t* ptr, int32_t& pos, size_t size)
199 {
200     if (size <= pos || size - pos < sizeof(int32_t)) {
201         return 0;
202     }
203     int32_t ret = 0;
204     pos += sizeof(int32_t);
205     for (int i = 0; i < sizeof(int32_t); i++) {
206         ret |= ((int32_t)ptr[i] << (BYTE_SIZE * i));
207     }
208     return ret;
209 }
210 
GetLong(const uint8_t* ptr, int32_t& pos, size_t size)211 long CommonFuzzer::GetLong(const uint8_t* ptr, int32_t& pos, size_t size)
212 {
213     if (size <= pos || size - pos < sizeof(long)) {
214         return 0;
215     }
216     long ret = 0;
217     pos += sizeof(long);
218     for (int i = 0; i < sizeof(long); i++) {
219         ret |= ((long)ptr[i] << (BYTE_SIZE * i));
220     }
221     return ret;
222 }
223 
GetString(const uint8_t* ptr, int32_t& pos, int32_t stringSize, size_t size)224 std::string CommonFuzzer::GetString(const uint8_t* ptr, int32_t& pos, int32_t stringSize, size_t size)
225 {
226     if (size <= pos || size - pos < stringSize) {
227         return nullptr;
228     }
229     stringSize = (stringSize > MAX_STRING_SIZE) ? MAX_STRING_SIZE : stringSize;
230     std::string ret(reinterpret_cast<const char*>(ptr + pos), stringSize);
231     pos += stringSize;
232     return ret;
233 }
234 } // namespace EDM
235 } // namespace OHOS