OpenBSD - PHP (chroot) - exec()不能执行静态链接的二进制文件



我使用OpenBSD和PHP作为我的私人主页。出于教学目的(不要在生产中使用它),我必须尝试在chroot中执行一个简单的Hello World程序。静态链接二进制文件。但我总是得到的结果127(命令未找到)。

如何在PHP中执行命令:

<?php
$output = null;
$result = null;
echo getcwd();
exec("./foo", $output, $result);
var_dump($output);
var_dump($result);
?>

程序./foo肯定驻留在当前工作目录中。文件权限也正确

C中的程序:

#include <stdio.h>
int main(int argc, char *argv[])
{
fprintf(stdout, "foo: stdout");
fprintf(stderr, "foo: stderr");
return 42;
}

编制:

$ cc -static -o foo foo.c

PHP输出:

htdocs/example.org/www
array(0) {
}
int(127)

如果程序是动态链接的(缺少共享库),我可以理解这种行为。

是否在OpenBSD的默认配置中启用了特定的安全功能,该功能不允许PHP执行二进制文件,或者有人可以解释为什么这不起作用?

也没有禁用/etc/php-8.0.ini中的exec()功能。

我找到解决办法了。

在OpenBSD的默认配置中,httpdPHPchroot中运行。将使用默认目录/var/www,/var/www/bin中只有少数应用程序。默认的shell也丢失了,不幸的是PHP的exec需要shell。因此错误127(command not found)。

一个快速而肮脏的解决方案是复制chroot:

中的/bin/sh(它是静态链接的)
$ cp /bin/sh /var/www/bin

现在PHP的exec命令应该可以在OpenBSD上工作。

最新更新