Problém je způsoben tím, že jsme včera upgradovali php z 5.2.11 na 5.2.12. V php 5.2.11 je chyba ve funkci tempnam() -
CVE-2009-3557, podrobný popis chyby je na
http://securityreason.com/securityalert/6601. V php 5.2.12 byla chyba opravena - do ext/standard/file.c, v sekci PHP_FUNCTION(tempnam) (definice php funkce tempnam()) byla přidána kontrola na safe mode:
Kód:
if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(arg1), NULL, CHECKUID_ALLOW_ONLY_DIR))) {
RETURN_FALSE;
}
Problém je, že tato oprava způsobila nekompatibilní chování funkce tempnam(). V php 5.2.12 se při volání tempnam("/cesta/k/adresari", "file") kontroluje na shodu uid/gid (pokud je zapnutý safe mode) adresář /cesta/k, tj. nadadresář adresáře /cesta/k/adresari. To je kvůli parametru CHECKUID_ALLOW_ONLY_DIR (3. parametr funkce php_checkuid() v definici php funkce tempnam()).
Příčina chyb, které vypisuje Drupal, je v tom, že Drupal používá funkci tempnam() a jako první parametr zadává cestu k tmp adresáři. V php 5.2.12 se ve funkci tempnam() provede kontrola na shodu uid/gid (safe mode je u nás zapnutý) pro nadadresář tmp adresáře a nadadresář tmp adresáře má odlišné uid/gid než tmp adresář a další soubory, které jsou součástí webu. Z toho důvodu se vypíše chybová hláška o SAFE MODE restrikci a funkce tempnam() se předčasně ukončí (to má za následek další chybové hlášky). My jsme upravili zdrojový kód php, parametr CHECKUID_ALLOW_ONLY_DIR jsme nahradili parametrem CHECKUID_CHECK_FILE_AND_DIR, takže příslušný úsek na kontrolu safe mode restrikce v definici funkce tmpnam() vypadá takto:
Kód:
if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(arg1), NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
RETURN_FALSE;
}
Díky tomu se při volání tempnam("/cesta/k/adresari", "file") nekontroluje nadadresář (/cesta/k), ale přímo adresář /cesta/k/adresari, který safe mode restrikci splňuje. Drupal odteď vámi uvedené chybové hlášky negeneruje.
Děkujeme za upozornění na tento problém.