安全研究

安全漏洞
PHP 5 posix_access()函数绕过safe_mode限制漏洞

发布日期:2008-06-18
更新日期:2008-06-19

受影响系统:
PHP PHP 5.2.6
描述:
BUGTRAQ  ID: 29797
CVE(CAN) ID: CVE-2008-2665

PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。

PHP 5的posix_access()函数在处理用户数据时存在漏洞,远程攻击者可能利用此漏洞绕过检查过滤。

在PHP的posix_access()函数中:

- ---
PHP_FUNCTION(posix_access)
{
    long mode = 0;
    int filename_len, ret;
    char *filename, *path;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &filename, &filename_len, &mode) == FAILURE) {  RETURN_FALSE;
    }

    path = expand_filepath(filename, NULL TSRMLS_CC);
    
    if (!path) {
        POSIX_G(last_error) = EIO;
        RETURN_FALSE;
    }

    if (php_check_open_basedir_ex(path, 0 TSRMLS_CC) ||
            (PG(safe_mode) && (!php_checkuid_ex(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR, CHECKUID_NO_ERRORS)))) {  efree(path);
        POSIX_G(last_error) = EPERM;
        RETURN_FALSE;
    }
    
    ret = access(path, mode);
    efree(path);

    if (ret) {
        POSIX_G(last_error) = errno;
        RETURN_FALSE;
    }

    RETURN_TRUE;
}
- ---

var_dump(posix_access("http://../../../etc/passwd"))==True
var_dump(posix_access("/etc/passwd"))==False

path = expand_filepath(filename, NULL TSRMLS_CC);会将http://../../../etc/passwd 更改为path=/etc/passwd,(PG(safe_mode) && (!php_checkuid_ex(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR, CHECKUID_NO_ERRORS)))会检查真实的路径http://../../../etc/passwd,php_checkuid_ex() 中使用了http:// ,因此就绕过了safe_mode限制。

<*来源:Maksymilian Arciemowicz (max@jestsuper.pl
  
  链接:http://marc.info/?l=full-disclosure&m=121382030225061&w=2
*>

建议:
厂商补丁:

PHP
---
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.php.net

浏览次数:2942
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障