execve在hook模式自动移除LD_PRELOAD环境变量,防止向下传递

This commit is contained in:
Pan Qiancheng 2025-04-16 11:28:18 +08:00
parent 9b7908b326
commit e93e41ce83
1 changed files with 29 additions and 28 deletions

View File

@ -25,7 +25,33 @@ orig_execve_type orig_execve = NULL;
* execve, * execve,
* *
*/ */
int execve(const char *filename, char *const argv[], char *const envp[]) { int execve(const char *filename, char *const argv[], char *const old_envp[]) {
// 移除LD_PRELOAD
// 计算原环境变量数量
size_t env_count = 0;
while (old_envp && old_envp[env_count]) {
env_count++;
}
// 分配新的环境变量数组(最多比原来少一个)
char **envp = malloc((env_count) * sizeof(char *));
if (!envp) {
perror("malloc");
return -1;
}
// 拷贝旧的 envp跳过 LD_PRELOAD
size_t i = 0;
for (size_t j = 0; j < env_count; j++) {
if (strncmp(old_envp[j], "LD_PRELOAD=", 11) != 0) {
envp[i++] = old_envp[j];
}
}
// 确保新数组末尾是 NULL
envp[i] = NULL;
#else #else
/** /**
* *
@ -37,6 +63,7 @@ int enhance_execve(const char *filename, char *const argv[],
char *const envp[]) { char *const envp[]) {
(void)envp; (void)envp;
#endif #endif
// 去除首尾空格 // 去除首尾空格
while (*filename && isspace(*filename)) { while (*filename && isspace(*filename)) {
filename++; filename++;
@ -196,33 +223,7 @@ int enhance_execve(const char *filename, char *const argv[],
#ifdef HOOK #ifdef HOOK
// 移除LD_PRELOAD return orig_execve(filename, argv, envp);
// 计算原环境变量数量
size_t env_count = 0;
while (envp && envp[env_count]) {
env_count++;
}
// 分配新的环境变量数组(最多比原来少一个)
char **new_envp = malloc((env_count) * sizeof(char *));
if (!new_envp) {
perror("malloc");
return -1;
}
// 拷贝旧的 envp跳过 LD_PRELOAD
size_t i = 0;
for (size_t j = 0; j < env_count; j++) {
if (strncmp(envp[j], "LD_PRELOAD=", 11) != 0) {
new_envp[i++] = envp[j];
}
}
// 确保新数组末尾是 NULL
new_envp[i] = NULL;
return orig_execve(filename, argv, new_envp);
#else #else
DEBUG_LOG("Ready to exec file: %s", filename); DEBUG_LOG("Ready to exec file: %s", filename);
return execve(filename, argv, envp); return execve(filename, argv, envp);