execve在hook模式自动移除LD_PRELOAD环境变量,防止向下传递
This commit is contained in:
parent
9b7908b326
commit
e93e41ce83
|
|
@ -25,7 +25,33 @@ orig_execve_type orig_execve = NULL;
|
|||
* 拦截系统调用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
|
||||
/**
|
||||
* 在真实系统调用之前可以调用这个函数,
|
||||
|
|
@ -37,6 +63,7 @@ int enhance_execve(const char *filename, char *const argv[],
|
|||
char *const envp[]) {
|
||||
(void)envp;
|
||||
#endif
|
||||
|
||||
// 去除首尾空格
|
||||
while (*filename && isspace(*filename)) {
|
||||
filename++;
|
||||
|
|
@ -196,33 +223,7 @@ int enhance_execve(const char *filename, char *const argv[],
|
|||
|
||||
#ifdef HOOK
|
||||
|
||||
// 移除LD_PRELOAD
|
||||
|
||||
// 计算原环境变量数量
|
||||
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);
|
||||
return orig_execve(filename, argv, envp);
|
||||
#else
|
||||
DEBUG_LOG("Ready to exec file: %s", filename);
|
||||
return execve(filename, argv, envp);
|
||||
|
|
|
|||
Loading…
Reference in New Issue