-1

在使用YARA在 PHP 应用程序内进行恶意软件扫描时,

yara -r ./php.yar -s /myapp

DangerousPhp /myapp/phpseclib/Net/SSH2.php
0x1140c:$system: system
0x1083a:$: call_user_func
0x1671f:$: call_user_func
0x154:$: EXEC

里面使用的恶意软件查找工具是https://github.com/nbs-system/php-malware-finder/

引发此错误的 phpseclib 库文件是https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Net/SSH2.php

任何帮助将不胜感激。

4

1 回答 1

1

假阳性。目前尚不清楚您使用的是哪个版本的 phpseclib,但我们假设您使用的是最新的 2.0 版本 (2.0.34)。call_user_func仅发生在第 2946 行:

https://github.com/phpseclib/phpseclib/blob/2.0.34/phpseclib/Net/SSH2.php#L2946

                default:
                    if (is_callable($callback)) {
                        if (call_user_func($callback, $temp) === true) {
                            $this->_close_channel(self::CHANNEL_EXEC);
                            return true;
                        }
                    } else {
                        $output.= $temp;
                    }

它在 exec() 方法中。$callback是一个参数,其用途在https://phpseclib.com/docs/commands#callbacks进行了讨论。3.0 分支$callback($temp)代替callback_user_func($temp)但它是相同的基本思想。可能$callback($temp)不适用于旧版本的 PHP,而callback_user_func($temp)可以。

call_user_func_array在 SSH2.php 中被调用两次。一次在2227 行,一次在3375 行

第 2227 行在login方法中。这是该方法的作用:

    function login($username)
    {
        $args = func_get_args();
        $this->auth[] = $args;

        // try logging with 'none' as an authentication method first since that's what
        // PuTTY does
        if (substr($this->server_identifier, 0, 15) != 'SSH-2.0-CoreFTP' && $this->auth_methods_to_continue === null) {
            if ($this->_login($username)) {
                return true;
            }
            if (count($args) == 1) {
                return false;
            }
        }
        return call_user_func_array(array(&$this, '_login'), $args);
    }

在 phpseclib 3.0.11 中它正在做return $this->sublogin($username, ...$args);,但基本思想是它获取每个元素$args并将其作为单独的参数传递给$this->_login. 就像如果你这样做了,$this->_login($args)那么_login只会采用一个参数。PHP 5.6 引入了 splat (...) 运算符,但 phpseclib 2 在 PHP 5.3 上运行,因此您必须执行call_user_func_array或仅使用单个参数,仅此而已。

这是另一个实例call_user_func_array

    function _reconnect()
    {
        $this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST);
        $this->retry_connect = true;
        if (!$this->_connect()) {
            return false;
        }
        foreach ($this->auth as $auth) {
            $result = call_user_func_array(array(&$this, 'login'), $auth);
        }
        return $result;
    }

所以同样的事情。

所以就像我说的,这是一个没有三明治的东西。误报。

于 2021-11-19T01:09:58.710 回答