• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "daemonstub_fuzzer.h"
16 
17 #include <cstddef>
18 #include <cstdint>
19 #include <cstring>
20 #include <string>
21 
22 #include "daemon_stub.h"
23 #include "distributed_file_daemon_ipc_interface_code.h"
24 #include "ipc_skeleton.h"
25 #include "message_option.h"
26 #include "message_parcel.h"
27 #include "securec.h"
28 #include "accesstoken_kit.h"
29 #include "utils_log.h"
30 #include "nativetoken_kit.h"
31 #include "token_setproc.h"
32 
33 namespace OHOS {
34 constexpr pid_t DATA_UID = 3012;
35 constexpr pid_t DAEMON_UID = 1009;
36 static pid_t UID = DAEMON_UID;
37 #ifdef CONFIG_IPC_SINGLE
38 using namespace IPC_SINGLE;
39 #endif
GetCallingUid()40 pid_t IPCSkeleton::GetCallingUid()
41 {
42     return UID;
43 }
44 }
45 
46 namespace OHOS {
47 using namespace OHOS::Storage::DistributedFile;
48 
49 class DaemonStubImpl : public DaemonStub {
50 public:
51     DaemonStubImpl() = default;
~DaemonStubImpl()52     ~DaemonStubImpl() override {}
OpenP2PConnection(const DistributedHardware::DmDeviceInfo & deviceInfo)53     int32_t OpenP2PConnection(const DistributedHardware::DmDeviceInfo &deviceInfo) override
54     {
55         return 0;
56     }
57 
CloseP2PConnection(const DistributedHardware::DmDeviceInfo & deviceInfo)58     int32_t CloseP2PConnection(const DistributedHardware::DmDeviceInfo &deviceInfo) override
59     {
60         return 0;
61     }
62 
OpenP2PConnectionEx(const std::string & networkId,sptr<IFileDfsListener> remoteReverseObj)63     int32_t OpenP2PConnectionEx(const std::string &networkId, sptr<IFileDfsListener> remoteReverseObj) override
64     {
65         return 0;
66     }
67 
CloseP2PConnectionEx(const std::string & networkId)68     int32_t CloseP2PConnectionEx(const std::string &networkId) override
69     {
70         return 0;
71     }
72 
PrepareSession(const std::string & srcUri,const std::string & dstUri,const std::string & srcDeviceId,const sptr<IRemoteObject> & listener,HmdfsInfo & info)73     int32_t PrepareSession(const std::string &srcUri,
74                            const std::string &dstUri,
75                            const std::string &srcDeviceId,
76                            const sptr<IRemoteObject> &listener,
77                            HmdfsInfo &info) override
78     {
79         return 0;
80     }
81 
CancelCopyTask(const std::string & sessionName)82     int32_t CancelCopyTask(const std::string &sessionName) override
83     {
84         return 0;
85     }
86 
RequestSendFile(const std::string & srcUri,const std::string & dstPath,const std::string & remoteDeviceId,const std::string & sessionName)87     int32_t RequestSendFile(const std::string &srcUri,
88                             const std::string &dstPath,
89                             const std::string &remoteDeviceId,
90                             const std::string &sessionName) override
91     {
92         return 0;
93     }
94 
GetRemoteCopyInfo(const std::string & srcUri,bool & isFile,bool & isDir)95     int32_t GetRemoteCopyInfo(const std::string &srcUri, bool &isFile, bool &isDir) override
96     {
97         return 0;
98     }
99 
PushAsset(int32_t userId,const sptr<AssetObj> & assetObj,const sptr<IAssetSendCallback> & sendCallback)100     int32_t PushAsset(int32_t userId,
101                       const sptr<AssetObj> &assetObj,
102                       const sptr<IAssetSendCallback> &sendCallback) override
103     {
104         return 0;
105     }
106 
RegisterAssetCallback(const sptr<IAssetRecvCallback> & recvCallback)107     int32_t RegisterAssetCallback(const sptr<IAssetRecvCallback> &recvCallback) override
108     {
109         return 0;
110     }
111 
UnRegisterAssetCallback(const sptr<IAssetRecvCallback> & recvCallback)112     int32_t UnRegisterAssetCallback(const sptr<IAssetRecvCallback> &recvCallback) override
113     {
114         return 0;
115     }
116 };
117 
HandleOpenP2PConnectionFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)118 void HandleOpenP2PConnectionFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
119                                      const uint8_t *data,
120                                      size_t size)
121 {
122     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_OPEN_P2P_CONNECTION);
123     MessageParcel datas;
124     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
125     datas.WriteBuffer(data, size);
126     datas.RewindRead(0);
127     MessageParcel reply;
128     MessageOption option;
129 
130     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
131 }
132 
HandleCloseP2PConnectionFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)133 void HandleCloseP2PConnectionFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
134                                       const uint8_t *data,
135                                       size_t size)
136 {
137     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CLOSE_P2P_CONNECTION);
138     MessageParcel datas;
139     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
140     datas.WriteBuffer(data, size);
141     datas.RewindRead(0);
142     MessageParcel reply;
143     MessageOption option;
144 
145     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
146 }
147 
HandleOpenP2PConnectionExFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)148 void HandleOpenP2PConnectionExFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
149                                        const uint8_t *data,
150                                        size_t size)
151 {
152     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_OPEN_P2P_CONNECTION_EX);
153     MessageParcel datas;
154     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
155     datas.WriteBuffer(data, size);
156     datas.RewindRead(0);
157     MessageParcel reply;
158     MessageOption option;
159 
160     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
161 }
162 
HandleCloseP2PConnectionExFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)163 void HandleCloseP2PConnectionExFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
164                                         const uint8_t *data,
165                                         size_t size)
166 {
167     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CLOSE_P2P_CONNECTION_EX);
168     MessageParcel datas;
169     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
170     datas.WriteBuffer(data, size);
171     datas.RewindRead(0);
172     MessageParcel reply;
173     MessageOption option;
174 
175     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
176 }
177 
HandlePrepareSessionFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)178 void HandlePrepareSessionFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr, const uint8_t *data, size_t size)
179 {
180     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_PREPARE_SESSION);
181     MessageParcel datas;
182     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
183     datas.WriteBuffer(data, size);
184     datas.RewindRead(0);
185     MessageParcel reply;
186     MessageOption option;
187 
188     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
189 }
190 
HandleCancelCopyTaskFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)191 void HandleCancelCopyTaskFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr, const uint8_t *data, size_t size)
192 {
193     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CANCEL_COPY_TASK);
194     MessageParcel datas;
195     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
196     datas.WriteBuffer(data, size);
197     datas.RewindRead(0);
198     MessageParcel reply;
199     MessageOption option;
200 
201     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
202 }
203 
HandleRequestSendFileFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)204 void HandleRequestSendFileFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
205                                    const uint8_t *data,
206                                    size_t size)
207 {
208     OHOS::UID = DAEMON_UID;
209     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE);
210     MessageParcel datas;
211     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
212     datas.WriteBuffer(data, size);
213     datas.RewindRead(0);
214     MessageParcel reply;
215     MessageOption option;
216 
217     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
218 }
219 
HandleGetRemoteCopyInfoFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)220 void HandleGetRemoteCopyInfoFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
221                                      const uint8_t *data,
222                                      size_t size)
223 {
224     OHOS::UID = DAEMON_UID;
225     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO);
226     MessageParcel datas;
227     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
228     datas.WriteBuffer(data, size);
229     datas.RewindRead(0);
230     MessageParcel reply;
231     MessageOption option;
232 
233     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
234 }
235 
HandlePushAssetFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)236 void HandlePushAssetFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr, const uint8_t *data, size_t size)
237 {
238     OHOS::UID = DATA_UID;
239     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_PUSH_ASSET);
240     MessageParcel datas;
241     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
242     datas.WriteBuffer(data, size);
243     datas.RewindRead(0);
244     MessageParcel reply;
245     MessageOption option;
246 
247     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
248 }
249 
HandleRegisterRecvCallbackFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)250 void HandleRegisterRecvCallbackFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
251                                         const uint8_t *data,
252                                         size_t size)
253 {
254     OHOS::UID = DATA_UID;
255     uint32_t code = static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REGISTER_ASSET_CALLBACK);
256     MessageParcel datas;
257     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
258     datas.WriteBuffer(data, size);
259     datas.RewindRead(0);
260     MessageParcel reply;
261     MessageOption option;
262 
263     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
264 }
265 
HandleUnRegisterRecvCallbackFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,const uint8_t * data,size_t size)266 void HandleUnRegisterRecvCallbackFuzzTest(std::shared_ptr<DaemonStub> daemonStubPtr,
267                                           const uint8_t *data,
268                                           size_t size)
269 {
270     OHOS::UID = DATA_UID;
271     uint32_t code =
272         static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_UN_REGISTER_ASSET_CALLBACK);
273     MessageParcel datas;
274     datas.WriteInterfaceToken(DaemonStub::GetDescriptor());
275     datas.WriteBuffer(data, size);
276     datas.RewindRead(0);
277     MessageParcel reply;
278     MessageOption option;
279 
280     daemonStubPtr->OnRemoteRequest(code, datas, reply, option);
281 }
282 
SetAccessTokenPermission()283 void SetAccessTokenPermission()
284 {
285     uint64_t tokenId;
286     const char *perms[1];
287     perms[0] = "ohos.permission.DISTRIBUTED_DATASYNC";
288 
289     NativeTokenInfoParams infoInstance = {
290         .dcapsNum = 0,
291         .permsNum = 1,
292         .aclsNum = 0,
293         .dcaps = nullptr,
294         .perms = perms,
295         .acls = nullptr,
296         .processName = "distributdFileDaemonstubFuzzer",
297         .aplStr = "system_basic",
298     };
299     tokenId = GetAccessTokenId(&infoInstance);
300     if (tokenId == 0) {
301         LOGE("Get Acess Token Id Failed");
302         return;
303     }
304     int ret = SetSelfTokenID(tokenId);
305     if (ret != 0) {
306         LOGE("Set Acess Token Id Failed");
307         return;
308     }
309     ret = Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
310     if (ret < 0) {
311         LOGE("Reload Native Token Info Failed");
312         return;
313     }
314 }
315 } // namespace OHOS
316 
317 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)318 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
319 {
320     /* Run your code on data */
321     OHOS::SetAccessTokenPermission();
322     auto daemonStubPtr = std::make_shared<OHOS::DaemonStubImpl>();
323     OHOS::HandleOpenP2PConnectionFuzzTest(daemonStubPtr, data, size);
324     OHOS::HandleCloseP2PConnectionFuzzTest(daemonStubPtr, data, size);
325     OHOS::HandlePrepareSessionFuzzTest(daemonStubPtr, data, size);
326     OHOS::HandleRequestSendFileFuzzTest(daemonStubPtr, data, size);
327     OHOS::HandleOpenP2PConnectionExFuzzTest(daemonStubPtr, data, size);
328     OHOS::HandleCloseP2PConnectionExFuzzTest(daemonStubPtr, data, size);
329     OHOS::HandleCancelCopyTaskFuzzTest(daemonStubPtr, data, size);
330     OHOS::HandleGetRemoteCopyInfoFuzzTest(daemonStubPtr, data, size);
331     OHOS::HandlePushAssetFuzzTest(daemonStubPtr, data, size);
332     OHOS::HandleRegisterRecvCallbackFuzzTest(daemonStubPtr, data, size);
333     OHOS::HandleUnRegisterRecvCallbackFuzzTest(daemonStubPtr, data, size);
334     return 0;
335 }
336