繁体   English   中英

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

[英]OpenBSD - PHP (chroot) - exec() cannot execute statically linked binary

我的私人主页使用 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 (未找到命令)。

一个快速而肮脏的解决方案是在 chroot 中复制/bin/sh (静态链接):

$ cp /bin/sh /var/www/bin

现在 PHP 的exec命令应该可以在 OpenBSD 上运行了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM