CVE-2024-48990(和 CVE-2024-48992)
为了确定一个 Python 进程(即正在运行 Python 解释器的进程)是否需要重启,needrestart 从该进程的 /proc/pid/environ 文件中提取 PYTHONPATH 环境变量(第 193 行),如果该变量存在则设置之(第 196 行),然后以 "-" 参数执行 Python("$ptable->{exec}",第 203 行)以从标准输入读取一个简短的硬编码脚本(第 204 行):
""" perl
135 sub files {
136 my $self = shift;
137 my $pid = shift;
138 my $cache = shift;
139 my $ptable = nr_ptable_pid($pid);
...
193 my %e = nr_parse_env($pid);
194 local %ENV;
195 if(exists($e{PYTHONPATH})) {
196 $ENV{PYTHONPATH} = $e{PYTHONPATH};
197 }
...
203 my ($pyread, $pywrite) = nr_fork_pipe2($self->{debug}, $ptable->{exec}, '-');
204 print $pywrite "import sys\nprint(sys.path)\n";
205 close($pywrite);
"""
不幸的是,如果某个 Python 进程属于本地攻击者,那么 needrestart 会使用攻击者控制的 PYTHONPATH 环境变量来执行 Python(第 203 行),这使得攻击者能够以 root 身份执行任意代码(尽管 needrestart 在第 204 行的硬编码 Python 脚本完全不受攻击者控制)。这就是 CVE-2024-48990。