php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #81131 open_basedir bypass through bindtextdomain()
Submitted: 2021-06-12 17:24 UTC Modified: 2021-07-12 17:23 UTC
Votes:4
Avg. Score:3.0 ± 1.4
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: jeffbencteux at gmail dot com Assigned: stas (profile)
Status: Assigned Package: Gettext related
PHP Version: 8.0.7 OS: Debian 10
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: jeffbencteux at gmail dot com
New email:
PHP Version: OS:

 

 [2021-06-12 17:24 UTC] jeffbencteux at gmail dot com
Description:
------------
It is possible to test for files and directories existence by using the $category parameter of the bindtextdomain() PHP function, thus bypassing open_basedir restriction.

A potential attacker could enumerate files with the help of a dictionary.

The root cause seems to be that this function does not enforce checks for open_basedir restrictions.

Test script:
---------------
<?php
/* 
Assuming:

* web root in /var/www/html/
* php.ini with open_basedir = /var/www/html/restricted

mkdir /var/www/html/restricted
echo "test" > /var/www/html/test.txt

The current file is located in /var/www/html/restricted/test.php
*/

echo bindtextdomain("test", "../test.txt");
?>

Expected result:
----------------
Warning: bindtextdomain(): open_basedir restriction in effect. File(/var/www/html/test.txt) is not within the allowed path(s): (/var/www/html/restricted) in /var/www/html/restricted/test.php on line 14


Actual result:
--------------
/var/www/html/test.txt

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-07-01 15:29 UTC] cmb@php.net
-Assigned To: +Assigned To: stas
 [2021-07-01 15:29 UTC] cmb@php.net
The fix is trivial:


 ext/gettext/gettext.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/ext/gettext/gettext.c b/ext/gettext/gettext.c
index 003787f5c0..cc027d57fd 100644
--- a/ext/gettext/gettext.c
+++ b/ext/gettext/gettext.c
@@ -278,6 +278,10 @@ PHP_NAMED_FUNCTION(zif_bindtextdomain)
 		RETURN_FALSE;
 	}
 
+	if (php_check_open_basedir(dir_name)) {
+		RETURN_FALSE;
+	}
+
 	retval = bindtextdomain(domain, dir_name);
 
 	RETURN_STRING(retval);


I'm not sure, though, whether not checking open_basedir is by
design.

Stas, what do you think?
 [2021-07-12 15:36 UTC] cmb@php.net
-Type: Security +Type: Bug
 [2021-07-12 15:36 UTC] cmb@php.net
open_basedir bypasses are not considered to be security issues;
cf. <https://externals.io/message/105606>
and <https://externals.io/message/115406>.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Nov 24 05:01:32 2024 UTC