【问题标题】:OpenBSD - PHP (chroot) - exec() cannot execute statically linked binaryOpenBSD - PHP(chroot) - exec()无法执行静态链接的二进制文件
【发布时间】:2021-10-19 04:08:00
【问题描述】:

我使用 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()功能。

【问题讨论】:

    标签: php exec chroot openbsd


    【解决方案1】:

    我找到了解决办法。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2015-04-02
      • 1970-01-01
      相关资源
      最近更新 更多