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