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 "usbmgrex_fuzzer.h"
17 #include <cstddef>
18 #include <cstdint>
19 #include "usb_service.h"
20
21 using namespace OHOS::HDI::Usb::V1_0;
22 using namespace OHOS::USB;
23
24 namespace OHOS {
25 constexpr size_t THRESHOLD = 10;
26 constexpr int32_t OFFSET = 4;
27 enum class UsbInterfaceCode {
28 USB_FUN_HAS_RIGHT = 0,
29 USB_FUN_REQUEST_RIGHT,
30 USB_FUN_REMOVE_RIGHT,
31 USB_FUN_OPEN_DEVICE,
32 USB_FUN_RESET_DEVICE,
33 USB_FUN_GET_DEVICE,
34 USB_FUN_GET_DEVICES,
35 USB_FUN_GET_CURRENT_FUNCTIONS,
36 USB_FUN_SET_CURRENT_FUNCTIONS,
37 USB_FUN_USB_FUNCTIONS_FROM_STRING,
38 USB_FUN_USB_FUNCTIONS_TO_STRING,
39 USB_FUN_CLAIM_INTERFACE,
40 USB_FUN_RELEASE_INTERFACE,
41 USB_FUN_BULK_TRANSFER_READ,
42 USB_FUN_BULK_TRANSFER_WRITE,
43 USB_FUN_CONTROL_TRANSFER,
44 USB_FUN_USB_CONTROL_TRANSFER,
45 USB_FUN_SET_ACTIVE_CONFIG,
46 USB_FUN_GET_ACTIVE_CONFIG,
47 USB_FUN_SET_INTERFACE,
48 USB_FUN_GET_PORTS,
49 USB_FUN_GET_SUPPORTED_MODES,
50 USB_FUN_SET_PORT_ROLE,
51 USB_FUN_REQUEST_QUEUE,
52 USB_FUN_REQUEST_WAIT,
53 USB_FUN_REQUEST_CANCEL,
54 USB_FUN_GET_DESCRIPTOR,
55 USB_FUN_GET_FILEDESCRIPTOR,
56 USB_FUN_CLOSE_DEVICE,
57 USB_FUN_BULK_AYSNC_READ,
58 USB_FUN_BULK_AYSNC_WRITE,
59 USB_FUN_BULK_AYSNC_CANCEL,
60 USB_FUN_REG_BULK_CALLBACK,
61 USB_FUN_UNREG_BULK_CALLBACK,
62 USB_FUN_ADD_RIGHT,
63 USB_FUN_DISABLE_GLOBAL_INTERFACE,
64 USB_FUN_DISABLE_DEVICE,
65 USB_FUN_DISABLE_INTERFACE_TYPE,
66 USB_FUN_CLEAR_HALT,
67 USB_FUN_GET_DEVICE_SPEED,
68 USB_FUN_GET_DRIVER_ACTIVE_STATUS,
69 USB_FUN_ADD_ACCESS_RIGHT,
70 USB_FUN_BULK_TRANSFER_READ_WITH_LENGTH,
71 USB_FUN_ATTACH_KERNEL_DRIVER,
72 USB_FUN_DETACH_KERNEL_DRIVER,
73 };
74 const std::u16string USB_INTERFACE_TOKEN = u"ohos.usb.IUsbSrv";
75 static uint32_t g_usbInterfaceCode = 0;
76 static constexpr uint32_t g_usbInterfaceCodeCount = 43; // UsbInterfaceCode Count - 1
77
SetTestCaseNative(TokenInfoParams *infoInstance)78 void SetTestCaseNative(TokenInfoParams *infoInstance)
79 {
80 uint64_t tokenId = GetAccessTokenId(infoInstance);
81 int ret = SetSelfTokenID(tokenId);
82 if (ret == 0) {
83 USB_HILOGI(MODULE_USB_SERVICE, "SetSelfTokenID success %{public}d", __LINE__);
84 } else {
85 USB_HILOGE(MODULE_USB_SERVICE, "SetSelfTokenID fail %{public}d", ret);
86 }
87 ret = Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
88 if (ret == 0) {
89 USB_HILOGI(MODULE_USB_SERVICE, "ReloadNativeTokenInfo success %{public}d", __LINE__);
90 } else {
91 USB_HILOGE(MODULE_USB_SERVICE, "ReloadNativeTokenInfo fail %{public}d", ret);
92 }
93 }
94
GrantPermissionSysNative()95 void GrantPermissionSysNative()
96 {
97 const char **permsInfo = new(std::nothrow)const char* [1];
98 permsInfo[0] = "ohos.permission.MANAGE_USB_CONFIG";
99 TokenInfoParams g_sysInfoInstance = {
100 .dcapsNum = 0,
101 .permsNum = 1,
102 .aclsNum = 0,
103 .dcaps = nullptr,
104 .perms = permsInfo,
105 .acls = nullptr,
106 .processName = "usb_manager_test_sys_with_perms",
107 .aplStr = "system_basic",
108 };
109 SetTestCaseNative(&g_sysInfoInstance);
110 }
111
GrantPermissionNormalNative()112 void GrantPermissionNormalNative()
113 {
114 TokenInfoParams g_normalInfoInstance = {
115 .dcapsNum = 0,
116 .permsNum = 0,
117 .aclsNum = 0,
118 .dcaps = nullptr,
119 .perms = nullptr,
120 .acls = nullptr,
121 .processName = "usb_manager_test_normal",
122 .aplStr = "normal",
123 };
124 SetTestCaseNative(&g_normalInfoInstance);
125 }
126
DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size)127 bool DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size)
128 {
129 if (rawData == nullptr) {
130 return false;
131 }
132 if (g_usbInterfaceCode > g_usbInterfaceCodeCount) {
133 return true;
134 }
135 uint32_t code = g_usbInterfaceCode;
136 if (code <= g_usbInterfaceCodeCount) {
137 g_usbInterfaceCode += 1;
138 }
139 rawData = rawData + OFFSET;
140 size = size - OFFSET;
141
142 MessageParcel data;
143 data.WriteInterfaceToken(USB_INTERFACE_TOKEN);
144 data.WriteBuffer(rawData, size);
145 data.RewindRead(0);
146 MessageParcel reply;
147 MessageOption option;
148 DelayedSpSingleton<UsbService>::GetInstance()->OnRemoteRequest(code, data, reply, option);
149 return true;
150 }
151 } // namespace OHOS
152
153 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)154 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
155 {
156 if (size < OHOS::THRESHOLD) {
157 return 0;
158 }
159
160 /* Run your code on data */
161 OHOS::DoSomethingInterestingWithMyAPI(data, size);
162 return 0;
163 }
164