169570cc8Sopenharmony_ci/* 269570cc8Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 369570cc8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 469570cc8Sopenharmony_ci * you may not use this file except in compliance with the License. 569570cc8Sopenharmony_ci * You may obtain a copy of the License at 669570cc8Sopenharmony_ci * 769570cc8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 869570cc8Sopenharmony_ci * 969570cc8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1069570cc8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1169570cc8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1269570cc8Sopenharmony_ci * See the License for the specific language governing permissions and 1369570cc8Sopenharmony_ci * limitations under the License. 1469570cc8Sopenharmony_ci */ 1569570cc8Sopenharmony_ci 1669570cc8Sopenharmony_ci#include "app_spawn_stub.h" 1769570cc8Sopenharmony_ci 1869570cc8Sopenharmony_ci#include <errno.h> 1969570cc8Sopenharmony_ci#include <fcntl.h> 2069570cc8Sopenharmony_ci#include <linux/capability.h> 2169570cc8Sopenharmony_ci#include <pthread.h> 2269570cc8Sopenharmony_ci#include <pwd.h> 2369570cc8Sopenharmony_ci#include <signal.h> 2469570cc8Sopenharmony_ci#include <stdarg.h> 2569570cc8Sopenharmony_ci#include <stdbool.h> 2669570cc8Sopenharmony_ci#include <stdlib.h> 2769570cc8Sopenharmony_ci#include <time.h> 2869570cc8Sopenharmony_ci#include <unistd.h> 2969570cc8Sopenharmony_ci 3069570cc8Sopenharmony_ci#include <sys/socket.h> 3169570cc8Sopenharmony_ci#include <sys/stat.h> 3269570cc8Sopenharmony_ci#include <sys/time.h> 3369570cc8Sopenharmony_ci#include <sys/types.h> 3469570cc8Sopenharmony_ci#include <sys/un.h> 3569570cc8Sopenharmony_ci#include <sys/wait.h> 3669570cc8Sopenharmony_ci 3769570cc8Sopenharmony_ci#include "appspawn_hook.h" 3869570cc8Sopenharmony_ci#include "appspawn_server.h" 3969570cc8Sopenharmony_ci#include "appspawn_sandbox.h" 4069570cc8Sopenharmony_ci#include "hilog/log.h" 4169570cc8Sopenharmony_ci#include "securec.h" 4269570cc8Sopenharmony_ci 4369570cc8Sopenharmony_ci#ifdef __cplusplus 4469570cc8Sopenharmony_ciextern "C" { 4569570cc8Sopenharmony_ci#endif 4669570cc8Sopenharmony_ci 4769570cc8Sopenharmony_ciStubNode g_stubNodes[] = { 4869570cc8Sopenharmony_ci {STUB_MOUNT, 0, 0, NULL}, 4969570cc8Sopenharmony_ci {STUB_EXECV, 0, 0, NULL}, 5069570cc8Sopenharmony_ci}; 5169570cc8Sopenharmony_ci 5269570cc8Sopenharmony_ciStubNode *GetStubNode(int type) 5369570cc8Sopenharmony_ci{ 5469570cc8Sopenharmony_ci if (type >= (int)(sizeof(g_stubNodes) / sizeof(g_stubNodes[0]))) { 5569570cc8Sopenharmony_ci return NULL; 5669570cc8Sopenharmony_ci } 5769570cc8Sopenharmony_ci 5869570cc8Sopenharmony_ci return &g_stubNodes[type]; 5969570cc8Sopenharmony_ci} 6069570cc8Sopenharmony_ci 6169570cc8Sopenharmony_civoid *DlopenStub(const char *pathname, int mode) 6269570cc8Sopenharmony_ci{ 6369570cc8Sopenharmony_ci UNUSED(pathname); 6469570cc8Sopenharmony_ci UNUSED(mode); 6569570cc8Sopenharmony_ci static size_t index = 0; 6669570cc8Sopenharmony_ci return &index; 6769570cc8Sopenharmony_ci} 6869570cc8Sopenharmony_ci 6969570cc8Sopenharmony_cistatic bool InitEnvironmentParamStub(const char *name) 7069570cc8Sopenharmony_ci{ 7169570cc8Sopenharmony_ci UNUSED(name); 7269570cc8Sopenharmony_ci return true; 7369570cc8Sopenharmony_ci} 7469570cc8Sopenharmony_ci 7569570cc8Sopenharmony_cistatic bool SetRendererSecCompPolicyStub(void) 7669570cc8Sopenharmony_ci{ 7769570cc8Sopenharmony_ci return true; 7869570cc8Sopenharmony_ci} 7969570cc8Sopenharmony_ci 8069570cc8Sopenharmony_cistatic void NWebRenderMainStub(const char *cmd) 8169570cc8Sopenharmony_ci{ 8269570cc8Sopenharmony_ci printf("NWebRenderMainStub cmd %s \n", cmd); 8369570cc8Sopenharmony_ci} 8469570cc8Sopenharmony_ci 8569570cc8Sopenharmony_ciuint32_t g_dlsymResultFlags = 0; 8669570cc8Sopenharmony_ci#define DLSYM_FAIL_SET_SEC_POLICY 0x01 8769570cc8Sopenharmony_ci#define DLSYM_FAIL_NWEB_MAIN 0x02 8869570cc8Sopenharmony_ci#define DLSYM_FAIL_INIT_ENV 0x04 8969570cc8Sopenharmony_civoid SetDlsymResult(uint32_t flags, bool success) 9069570cc8Sopenharmony_ci{ 9169570cc8Sopenharmony_ci if (success) { 9269570cc8Sopenharmony_ci g_dlsymResultFlags &= ~flags; 9369570cc8Sopenharmony_ci } else { 9469570cc8Sopenharmony_ci g_dlsymResultFlags |= flags; 9569570cc8Sopenharmony_ci } 9669570cc8Sopenharmony_ci} 9769570cc8Sopenharmony_ci 9869570cc8Sopenharmony_civoid *DlsymStub(void *handle, const char *symbol) 9969570cc8Sopenharmony_ci{ 10069570cc8Sopenharmony_ci printf("DlsymStub %s \n", symbol); 10169570cc8Sopenharmony_ci UNUSED(handle); 10269570cc8Sopenharmony_ci if (strcmp(symbol, "InitEnvironmentParam") == 0) { 10369570cc8Sopenharmony_ci return ((g_dlsymResultFlags & DLSYM_FAIL_INIT_ENV) == 0) ? (void *)(InitEnvironmentParamStub) : NULL; 10469570cc8Sopenharmony_ci } 10569570cc8Sopenharmony_ci if (strcmp(symbol, "SetRendererSeccompPolicy") == 0) { 10669570cc8Sopenharmony_ci return ((g_dlsymResultFlags & DLSYM_FAIL_SET_SEC_POLICY) == 0) ? (void *)(SetRendererSecCompPolicyStub) : NULL; 10769570cc8Sopenharmony_ci } 10869570cc8Sopenharmony_ci if (strcmp(symbol, "NWebRenderMain") == 0) { 10969570cc8Sopenharmony_ci return ((g_dlsymResultFlags & DLSYM_FAIL_NWEB_MAIN) == 0) ? (void *)(NWebRenderMainStub) : NULL; 11069570cc8Sopenharmony_ci } 11169570cc8Sopenharmony_ci return NULL; 11269570cc8Sopenharmony_ci} 11369570cc8Sopenharmony_ci 11469570cc8Sopenharmony_ciint DlcloseStub(void *handle) 11569570cc8Sopenharmony_ci{ 11669570cc8Sopenharmony_ci UNUSED(handle); 11769570cc8Sopenharmony_ci return 0; 11869570cc8Sopenharmony_ci} 11969570cc8Sopenharmony_ci 12069570cc8Sopenharmony_civoid DisallowInternet(void) 12169570cc8Sopenharmony_ci{ 12269570cc8Sopenharmony_ci} 12369570cc8Sopenharmony_ci 12469570cc8Sopenharmony_cibool may_init_gwp_asan(bool forceInit) 12569570cc8Sopenharmony_ci{ 12669570cc8Sopenharmony_ci return false; 12769570cc8Sopenharmony_ci} 12869570cc8Sopenharmony_ci 12969570cc8Sopenharmony_ciint SetgroupsStub(size_t size, const gid_t *list) 13069570cc8Sopenharmony_ci{ 13169570cc8Sopenharmony_ci UNUSED(size); 13269570cc8Sopenharmony_ci UNUSED(list); 13369570cc8Sopenharmony_ci return 0; 13469570cc8Sopenharmony_ci} 13569570cc8Sopenharmony_ci 13669570cc8Sopenharmony_ciint SetresuidStub(uid_t ruid, uid_t euid, uid_t suid) 13769570cc8Sopenharmony_ci{ 13869570cc8Sopenharmony_ci UNUSED(ruid); 13969570cc8Sopenharmony_ci UNUSED(euid); 14069570cc8Sopenharmony_ci UNUSED(suid); 14169570cc8Sopenharmony_ci return 0; 14269570cc8Sopenharmony_ci} 14369570cc8Sopenharmony_ci 14469570cc8Sopenharmony_ciint SetresgidStub(gid_t rgid, gid_t egid, gid_t sgid) 14569570cc8Sopenharmony_ci{ 14669570cc8Sopenharmony_ci UNUSED(rgid); 14769570cc8Sopenharmony_ci UNUSED(egid); 14869570cc8Sopenharmony_ci UNUSED(sgid); 14969570cc8Sopenharmony_ci return 0; 15069570cc8Sopenharmony_ci} 15169570cc8Sopenharmony_ci 15269570cc8Sopenharmony_ciint CapsetStub(cap_user_header_t hdrp, const cap_user_data_t datap) 15369570cc8Sopenharmony_ci{ 15469570cc8Sopenharmony_ci UNUSED(hdrp); 15569570cc8Sopenharmony_ci UNUSED(datap); 15669570cc8Sopenharmony_ci return 0; 15769570cc8Sopenharmony_ci} 15869570cc8Sopenharmony_ci 15969570cc8Sopenharmony_ciint UnshareStub(int flags) 16069570cc8Sopenharmony_ci{ 16169570cc8Sopenharmony_ci printf("UnshareStub %x \n", flags); 16269570cc8Sopenharmony_ci return 0; 16369570cc8Sopenharmony_ci} 16469570cc8Sopenharmony_ci 16569570cc8Sopenharmony_ciint MountStub(const char *originPath, const char *destinationPath, 16669570cc8Sopenharmony_ci const char *fsType, unsigned long mountFlags, const char *options, mode_t mountSharedFlag) 16769570cc8Sopenharmony_ci{ 16869570cc8Sopenharmony_ci StubNode *node = GetStubNode(STUB_MOUNT); 16969570cc8Sopenharmony_ci if (node == NULL || node->arg == NULL || (node->flags & STUB_NEED_CHECK) != STUB_NEED_CHECK) { 17069570cc8Sopenharmony_ci return 0; 17169570cc8Sopenharmony_ci } 17269570cc8Sopenharmony_ci MountArg *args = (MountArg *)node->arg; 17369570cc8Sopenharmony_ci 17469570cc8Sopenharmony_ci printf("args->originPath %s == %s \n", args->originPath, originPath); 17569570cc8Sopenharmony_ci printf("args->destinationPath %s == %s \n", args->destinationPath, destinationPath); 17669570cc8Sopenharmony_ci printf("args->fsType %s == %s \n", args->fsType, fsType); 17769570cc8Sopenharmony_ci printf("args->options %s == %s \n", args->options, options); 17869570cc8Sopenharmony_ci printf("mountFlags %lx args->mountFlags %lx \n", mountFlags, args->mountFlags); 17969570cc8Sopenharmony_ci printf("mountSharedFlag 0x%x args->mountSharedFlag 0x%x \n", mountSharedFlag, args->mountSharedFlag); 18069570cc8Sopenharmony_ci 18169570cc8Sopenharmony_ci if (originPath != NULL && (strcmp(originPath, args->originPath) == 0)) { 18269570cc8Sopenharmony_ci int result = (destinationPath != NULL && (strcmp(destinationPath, args->destinationPath) == 0) && 18369570cc8Sopenharmony_ci (mountFlags == args->mountFlags) && 18469570cc8Sopenharmony_ci (args->fsType == NULL || (fsType != NULL && strcmp(fsType, args->fsType) == 0)) && 18569570cc8Sopenharmony_ci (args->options == NULL || (options != NULL && strcmp(options, args->options) == 0))); 18669570cc8Sopenharmony_ci errno = result ? 0 : -EINVAL; 18769570cc8Sopenharmony_ci node->result = result ? 0 : -EINVAL; 18869570cc8Sopenharmony_ci printf("MountStub result %d node->result %d \n", result, node->result); 18969570cc8Sopenharmony_ci return errno; 19069570cc8Sopenharmony_ci } 19169570cc8Sopenharmony_ci return 0; 19269570cc8Sopenharmony_ci} 19369570cc8Sopenharmony_ci 19469570cc8Sopenharmony_ciint SymlinkStub(const char *target, const char *linkName) 19569570cc8Sopenharmony_ci{ 19669570cc8Sopenharmony_ci return 0; 19769570cc8Sopenharmony_ci} 19869570cc8Sopenharmony_ci 19969570cc8Sopenharmony_ciint ChdirStub(const char *path) 20069570cc8Sopenharmony_ci{ 20169570cc8Sopenharmony_ci return 0; 20269570cc8Sopenharmony_ci} 20369570cc8Sopenharmony_ci 20469570cc8Sopenharmony_ciint ChrootStub(const char *path) 20569570cc8Sopenharmony_ci{ 20669570cc8Sopenharmony_ci return 0; 20769570cc8Sopenharmony_ci} 20869570cc8Sopenharmony_ci 20969570cc8Sopenharmony_cilong int SyscallStub(long int type, ...) 21069570cc8Sopenharmony_ci{ 21169570cc8Sopenharmony_ci return 0; 21269570cc8Sopenharmony_ci} 21369570cc8Sopenharmony_ci 21469570cc8Sopenharmony_ciint Umount2Stub(const char *path, int type) 21569570cc8Sopenharmony_ci{ 21669570cc8Sopenharmony_ci return 0; 21769570cc8Sopenharmony_ci} 21869570cc8Sopenharmony_ci 21969570cc8Sopenharmony_ciint UmountStub(const char *path) 22069570cc8Sopenharmony_ci{ 22169570cc8Sopenharmony_ci return 0; 22269570cc8Sopenharmony_ci} 22369570cc8Sopenharmony_ci 22469570cc8Sopenharmony_ciint mallopt(int param, int value) 22569570cc8Sopenharmony_ci{ 22669570cc8Sopenharmony_ci return 0; 22769570cc8Sopenharmony_ci} 22869570cc8Sopenharmony_ci 22969570cc8Sopenharmony_ciint AccessStub(const char *pathName, int mode) 23069570cc8Sopenharmony_ci{ 23169570cc8Sopenharmony_ci if (strstr(pathName, "/data/app/el2/50/base") != NULL) { 23269570cc8Sopenharmony_ci return -1; 23369570cc8Sopenharmony_ci } 23469570cc8Sopenharmony_ci if (strstr(pathName, "/mnt/sandbox/50/com.example.myapplication/data/storage/el2") != NULL) { 23569570cc8Sopenharmony_ci return -1; 23669570cc8Sopenharmony_ci } 23769570cc8Sopenharmony_ci if (strstr(pathName, "/data/app/el5/100/base/com.example.myapplication") != NULL) { 23869570cc8Sopenharmony_ci return -1; 23969570cc8Sopenharmony_ci } 24069570cc8Sopenharmony_ci return 0; 24169570cc8Sopenharmony_ci} 24269570cc8Sopenharmony_ci 24369570cc8Sopenharmony_ciint ExecvStub(const char *pathName, char *const argv[]) 24469570cc8Sopenharmony_ci{ 24569570cc8Sopenharmony_ci printf("ExecvStub %s \n", pathName); 24669570cc8Sopenharmony_ci StubNode *node = GetStubNode(STUB_EXECV); 24769570cc8Sopenharmony_ci if (node == NULL || node->arg == NULL || (node->flags & STUB_NEED_CHECK) != STUB_NEED_CHECK) { 24869570cc8Sopenharmony_ci return 0; 24969570cc8Sopenharmony_ci } 25069570cc8Sopenharmony_ci 25169570cc8Sopenharmony_ci ExecvFunc func = (ExecvFunc)node->arg; 25269570cc8Sopenharmony_ci func(pathName, argv); 25369570cc8Sopenharmony_ci return 0; 25469570cc8Sopenharmony_ci} 25569570cc8Sopenharmony_ci 25669570cc8Sopenharmony_ciint ExecvpStub(const char *pathName, char *const argv[]) 25769570cc8Sopenharmony_ci{ 25869570cc8Sopenharmony_ci printf("ExecvpStub %s \n", pathName); 25969570cc8Sopenharmony_ci return 0; 26069570cc8Sopenharmony_ci} 26169570cc8Sopenharmony_ci 26269570cc8Sopenharmony_ciint ExecveStub(const char *pathName, char *const argv[], char *const env[]) 26369570cc8Sopenharmony_ci{ 26469570cc8Sopenharmony_ci printf("ExecveStub %s \n", pathName); 26569570cc8Sopenharmony_ci return 0; 26669570cc8Sopenharmony_ci} 26769570cc8Sopenharmony_ci 26869570cc8Sopenharmony_ciint SetconStub(const char *name) 26969570cc8Sopenharmony_ci{ 27069570cc8Sopenharmony_ci printf("SetconStub %s \n", name); 27169570cc8Sopenharmony_ci return 0; 27269570cc8Sopenharmony_ci} 27369570cc8Sopenharmony_ci 27469570cc8Sopenharmony_ciint GetprocpidStub() 27569570cc8Sopenharmony_ci{ 27669570cc8Sopenharmony_ci return 0; 27769570cc8Sopenharmony_ci} 27869570cc8Sopenharmony_ci 27969570cc8Sopenharmony_ciint CloneStub(int (*fn)(void *), void *stack, int flags, void *arg, ...) 28069570cc8Sopenharmony_ci{ 28169570cc8Sopenharmony_ci printf("CloneStub 11 %d \n", getpid()); 28269570cc8Sopenharmony_ci pid_t pid = fork(); 28369570cc8Sopenharmony_ci if (pid == 0) { 28469570cc8Sopenharmony_ci fn(arg); 28569570cc8Sopenharmony_ci _exit(0x7f); // 0x7f user exit 28669570cc8Sopenharmony_ci } 28769570cc8Sopenharmony_ci return pid; 28869570cc8Sopenharmony_ci} 28969570cc8Sopenharmony_ci 29069570cc8Sopenharmony_ciint SetuidStub(uid_t uid) 29169570cc8Sopenharmony_ci{ 29269570cc8Sopenharmony_ci return 0; 29369570cc8Sopenharmony_ci} 29469570cc8Sopenharmony_ci 29569570cc8Sopenharmony_ciint SetgidStub(gid_t gid) 29669570cc8Sopenharmony_ci{ 29769570cc8Sopenharmony_ci return 0; 29869570cc8Sopenharmony_ci} 29969570cc8Sopenharmony_ci 30069570cc8Sopenharmony_ciint IoctlStub(int fd, unsigned long request, ...) 30169570cc8Sopenharmony_ci{ 30269570cc8Sopenharmony_ci return 0; 30369570cc8Sopenharmony_ci} 30469570cc8Sopenharmony_ci 30569570cc8Sopenharmony_ci#ifdef __cplusplus 30669570cc8Sopenharmony_ci} 30769570cc8Sopenharmony_ci#endif 308