PHP blasted with double-barrelled security holes

Support, Snippets & Projects

Moderators: Moderator, Global Moderator

Post Reply
Tami
Administrator
Administrator
Posts: 10892
Joined: Sun Apr 25, 2004 1:05 pm

PHP blasted with double-barrelled security holes

Post by Tami »

PHP blasted with double-barrelled security holes
Two vulnerabilities allow for code execution on both servers and PCs.


By Matthew Broersma, [url=\"http://www.techworld.com\"]TechWorld[/url]


PHP contains two critical bugs that could allow someone to take over a server and use a browser to run dangerous code, German IT security firm E-matters has warned.


PHP is the most popular scripting module on Apache servers and is enabled on at least half of all Apache servers, according to figures from SecuritySpace. The browsers affected are Explorer and Safari - accounting for virtually the entire market.


The PHP Group issued a [url=\"http://www.php.net/release_4_3_8.php\"]Patch[/url] for the flaws on Wednesday, and Linux vendors have also begun releasing fixes tailored for their particular distributions, according to security firm Secunia, which maintains a vulnerabilities database.


On Wednesday, the PHP Group also released the final version of PHP 5.0, which fixes the flaws. The bugs were confirmed in PHP versions 4.3.7 and earlier, and PHP 5.0 release candidate 3 and earlier.


The first flaw, involving various errors in PHP\'s memory_limit request termination, could be exploited to allow an attacker to execute arbitrary code on a server with a vulnerable implementation of PHP enabled, researchers said. The exploit works on any platform, according to a report by E-matters researcher Stefan Esser, who said he discovered the problem during a re-audit of memory_limit following a related advisory late last month. Vendors were notified a week ago and the problem was made public on Wednesday, E-matters said.


The second problem could be used to launch unsafe code in Internet Explorer and Apple\'s Safari browser because of the way those browsers handle miscoded HTML. PHP\'s strip_tags() function is often used to block cross-site scripting attacks by removing unsafe HTML from user input. However, it is possible to slip unsafe script past strip_tags() by inserting characters such as \0 in the input - for example disguising a \"script\" tag as \"\0script\".


Such tags would have no effect on most browsers because they would be considered errors and ignored. However, a feature in IE and Safari strips out errors such as \0 and then renders the code, thus allowing potentially dangerous code to render in the browser. The server patch blocks the dangerous code from reaching the browsers.


Cross-site scripting attacks can run malicious tags and code in a browser as a result of clicking on a hyperlink or reading an email. Such attacks can result in hijacking a user session, changing user settings, stealing browser cookies and other exploits, according to security advisory service CERT.


Secunia researchers said IE and Safari had been rendered vulnerable by a feature whose security implications hadn\'t been considered clearly enough. \"This is not a vulnerability in those browsers, but unfortunate and unnecessary functionality,\" the firm said in its advisory.


[url=\"http://security.e-matters.de/advisories/112004.html\"]Advisory On Problem One[/url]

Advisory 11/2004
PHP memory_limit remote vulnerability

Release Date: 2004/07/14
Author: Stefan Esser [s.esser@ematters.de]
Application: PHP <= 4.3.7
PHP5 <= 5.0.0RC3
Severity: A vulnerability within PHP allows remote code execution on PHP servers with activated memory_limit
Risk: Critical
Reference: [url=\"http://security.e-matters.de/advisories/112004.html\"]http://security.e-matters.de/advisories/112004.html[/url]
Last Modified: 2004/07/15

Overview

PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.

According to Security Space PHP is the most popular Apache module and is installed on about 50% of all Apaches worldwide. This figure includes of course only those servers that are not configured with expose_php=Off.

During a reaudit of the memory_limit problematic it was discovered that it is possible for a remote attacker to trigger the memory_limit request termination in places where an interruption is unsafe. This can be abused to execute arbitrary code on remote PHP servers.

Details

On the 28th June 2004 Georgi Guninski released his advisory about a possible remote DOS vulnerability within Apache 2 (CAN-2004-0493). This vulnerability allows tricking Apache 2 into acception arbitrary sized HTTP headers. Guninski and many others rated this bug as \"Low Risk\" for 32bit systems, but they did not take into account that such a bug could have a huge impact on 3rd party modules.

After his advisory was released I reaudited PHP\'s memory_limit request termination, because this bug made it possible to reach the memory_limit at places that were never meant to be interrupted. After a possible exploitation path for Apache 2 servers was discovered and a working exploit was created, similar pathes were found and added to the proof of concept exploit that allowed exploitation of NON Apache 2 servers. (f.e. Apache 1.3.31)

The idea of the exploit is simple. When PHP allocates a block of memory it first checks in the cache of free memory blocks for a block of the same size. If such a block is found it is taken from the cache otherwise PHP checks if an allocation would violate the memory_limit. In that case the request shutdown is triggered through zend_error(). (PHP < 4.3.7 aborts after the violating memory block is allocated) PHP contains several places where such an interruption is unsafe. An example for such places are those where Zend HashTables are allocated and initialised. This is performed in 2 steps and the initialisation step itself allocates memory before important members are correctly initialised. An attacker that is able to trigger the memory_limit abort within zend_hash_init() and is additionally able to control the heap before the HashTable itself is allocated, is able to supply his own HashTable destructor pointer.

Several places within PHP where found where this action is performed on HashTables that actually get destructed by the request shutdown. One of such places is f.e. within the fileupload code, but is only triggerable on Apache 2 servers that are vulnerable to CAN-2004-0493, another one is only reachable if variables_order was changed to have the \"E\" in the end, a third one is within session extension which is activated by default but the vulnerability can not be triggered if the session functionality is not used. A fourth place is within the implementation of the register_globals functionality. Although this is deactivated by default since PHP 4.2 it is activated on nearly all servers that have to ensure compatibility with older scripts. Other places might exist in not default activated or 3rd party extensions.

All mentioned places outside of the extensions are quite easy to exploit, because the memory allocation up to those places is deterministic and quite static throughout different PHP versions. The only unknown entity is the size of the environment vars array. But that is usually small and can be bruteforced with some kind of binary search algorithm. Additionally this information could leak to an attacker through an open phpinfo() page. If the admin used php.ini-recommended as configuration basis it is irrelevant anyway because the ENV array is not populated in that case.

Because the exploit itself consist of supplying an arbitrary destructor pointer this bug is exploitable on any platform. (Except the system runs with non exec heap+stack protection) This includes systems running Hardened-PHP <= 0.1.2 because they have no protection of the HashTable destructor pointer.

As a last word it should be said, that an attacker does not need to send 8/16/64MB (or whatever the memory_limit is) per attack. With POST requests it is quite easy to eat 100 (and more) times the amount of sent bytes.

Proof of Concept

e-matters is not going to release an exploit for this vulnerability to the public.

Disclosure Timeline

07 July 2004 Vendor-sec was informed about the fact that this vulnerability was found
14 July 2004 Public Disclosure

CVE Information

The Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the name CAN-2004-0594 to this issue.

Recommendation

If you are running PHP with compiled in memory_limit support, it is strongly recommended that you upgrade as soon as possible to the newest version. Disabling memory_limit within your configuration can be considered a workaround, but leaves your site vulnerable to memory hungry PHP scripts or POST requests that create huge variables. If you are running PHP with Apache <= 2.0.49 ensure that you have the fix for CAN-2004-0493 applied.

Copyright 2004 Stefan Esser. All rights reserved.


[B][url=\"http://security.e-matters.de/advisories/122004.html\"]The Advisory On Problem Two[/url]B]

Advisory 12/2004
PHP strip_tags() bypass vulnerability

Release Date: 2004/07/14
Author: Stefan Esser [s.esser@ematters.de]
Application: PHP <= 4.3.7
PHP5 <= 5.0.0RC3
Severity: A binary safety problem within PHP\'s strip_tags() function may allow injection of arbitrary tags in Internet Explorer and Safari browsers
Risk: Moderate
Reference: [url=\"http://security.e-matters.de/advisories/122004.html\"]http://security.e-matters.de/advisories/122004.html[/url]
Last Modified: 2004/07/14

Overview

PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.

According to Security Space PHP is the most popular Apache module and is installed on about 50% of all Apaches worldwide. This figure includes of course only those servers that are not configured with expose_php=Off.

During an audit of the PHP source code a binary safety problem in the handling of allowed tags within PHP\'s strip_tags() function was discovered. This problem may allow injection of f.e. javascript in Internet Explorer and Safari browsers.

Details

Many sites stop XSS attacks by striping unsafe HTML tags from the user\'s input. PHP scripts usually implement this functionality with the strip_tags() function. This function takes a optional second parameter to specify tags that should not get stripped from the input.

$example = strip_tags($_REQUEST[\'user_input\'], \"\");

Due to a binary safety problem within the allowed tags handling attacker supplied tags like: <\0script> or will pass the check and wont get stripped. (magic_quotes_gpc must be Off)

In a perfect world this would be no dangerous problem because such tags are either in the allowed taglist or should get ignored by the browser because they have no meaning in HTML.

In the real world however MS Internet Explorer and Safari filter \'\0\' characters from the tag and accept them as valid. Quite obvious that this can not only lead to a number of XSS issues on sites that filter dangerous tags with PHP\'s strip_tags() but also on every other site that filters them with pattern matching and is not necessary running PHP.

According to tests:

- Opera
- Konqueror
- Mozilla
- Mozilla Firefox
- Epiphany

are NOT affected by this.

Proof of Concept

e-matters is not going to release an exploit for this vulnerability to the public.

Disclosure Timeline

26 June 2004 Problem found and fixed in CVS
14 July 2004 Public Disclosure

CVE Information

The Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the name CAN-2004-0595 to this issue.

Recommendation

Because Internet Explorer is out of all reason still the most used browser fixing this problem within your PHP version is strongly recommended.

Copyright 2004 Stefan Esser. All rights reserved.
Image

[color=\"#41211C\"]It takes years to build up trust and only seconds to destroy it

[/color]
ner0
Hero Member
Hero Member
Posts: 982
Joined: Sat May 22, 2004 4:45 pm

PHP blasted with double-barrelled security holes

Post by ner0 »

[font=\"Courier\"][color=\"purple\"]Makes me glad I upgraded my php /bigwink.gif\' class=\'bbc_emoticon\' alt=\';)\' />[/color][/font]
[color=\"green\"]'class KPIM::ProcessManager' only defines private constructors and has no friends[/color] <- :( poor class



[18:09:00] * ~Moppy stews ner0 erotically 1 times.
Post Reply

Return to “PHP &amp; MySQL”