PolyShell - zaustavljen upload na Magento

U nedjelju ujutro naš sigurnosni nadzor poslao je upozorenje: u mapi za medije jedne Magento trgovine koju održavamo pojavile su se nove PHP datoteke. U roku od sat vremena znali smo o čemu se radi, potvrdili da se ništa nije izvršilo i zatvorili rupu na svim Magento trgovinama o kojima brinemo.

Što se dogodilo

Napad je poznat pod imenom PolyShell. Magento kupcu omogućuje da uz proizvod priloži datoteku preko "custom option" polja, na primjer logo za graviranje. REST i GraphQL API košarice prima tu datoteku kao base64 podatke i sprema je u pub/media/custom_options/quote/, čak i kad proizvod takvu opciju uopće nema. Napadač otvori anonimnu košaricu, doda bilo koji proizvod i pošalje "datoteku" koja počinje GIF zaglavljem, kako bi prošla provjeru slike. Ostatak datoteke je PHP kod, odnosno mali program za daljinsko upravljanje serverom.

U jednoj noći dvije su adrese ubacile sedam takvih datoteka u svježe instaliranu trgovinu s najnovijom verzijom Magenta (2.4.8-p5). Datoteke su imale imena poput nkteam_663186.php i pr7k.php. Jedna je bila napravljena da pročita app/etc/env.php, u kojem su lozinka baze i ključ za šifriranje.

Zašto se ništa nije izvršilo

Ubacivanje datoteke samo je pola napada. Napadač je zatim mora otvoriti u pregledniku da je server pokrene. Naši serveri koriste preporučena Magento pravila web servera koja zabranjuju svaki pristup mapi media/custom_options/. Svaki napadačev pokušaj dobio je odgovor 404, a u zapisima servera nema nijednog uspješnog zahtjeva. Datoteke su neiskorištene ležale na disku dok ih nismo premjestili u karantenu.

Trgovine na Apacheu bez tih pravila, ili one kod kojih se datoteka .htaccess ignorira, nemaju takvu sreću. Kod njih isti upload znači potpunu kontrolu nad trgovinom.

Zakrpa

Pravila web servera sprječavaju da se datoteke pokrenu, ali nismo ih htjeli ni na disku. Nijedna trgovina koju održavamo ne prodaje proizvode s uploadom datoteke, pa smo napisali mali Magento modul koji odbija upload prije nego što se išta zapiše:

// app/code/Custom/BlockOptionUpload/etc/di.xml
<type name="Magento\Catalog\Model\Webapi\Product\Option\Type\File\Processor">
    <plugin name="custom_block_option_upload"
            type="Custom\BlockOptionUpload\Plugin\BlockFileUpload"/>
</type>

// app/code/Custom/BlockOptionUpload/Plugin/BlockFileUpload.php
public function aroundProcessFileContent(Processor $subject, callable $proceed,
                                         ImageContentInterface $imageContent)
{
    $this->logger->warning('Odbijen upload datoteke preko custom options API-ja', [
        'name' => (string) $imageContent->getName(),
        'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
    ]);
    throw new InputException(__('File upload is not allowed.'));
}

Svaka datoteka poslana preko API-ja košarice sada dobiva odgovor "File upload is not allowed.", ništa ne završi u mapi za medije, a pokušaj se zapiše u Magento log s adresom pošiljatelja. Obična kupnja, naplata i administracija rade kao i prije. Prije nego što smo posao proglasili gotovim, modul smo na svakoj trgovini testirali bezopasnom datotekom.

Provjerite svoju trgovinu

Ako imate Magento 2, potražite PHP datoteke ondje gdje bi trebale biti samo slike kupaca:

find pub/media/custom_options -type f \( -name '*.php*' -o -name '*.phtml' -o -name '*.phar' \)

Ako naredba nešto pronađe, u zapisima web servera provjerite je li neka od tih datoteka ikad otvorena s odgovorom 200. Zatim ih premjestite izvan web mape, provjerite da web server zabranjuje pristup mapi media/custom_options/ i blokirajte sam upload. Na jednoj starijoj testnoj kopiji pronašli smo dvjestotinjak takvih datoteka, ostataka napada od prije nekoliko mjeseci, prije nego što je kopija napravljena.

Zašto je nadzor važan

Ovaj napad ne mijenja izgled trgovine niti je usporava. Pregledavanjem stranice nitko ga ne bi primijetio. Otkrili smo ga samo zato što AI agent za nadzor nekoliko puta dnevno provjerava svaki server koji održavamo: nove SSH ključeve, rudare kriptovaluta i PHP datoteke u mapama za upload. Mail šalje samo kad nešto traži čovjeka. To je vrsta AI agenta koji štiti poslovanje, a takve izrađujemo i vodimo za naše klijente.

Ako imate Magento ili WordPress trgovinu i niste sigurni je li sigurna, This email address is being protected from spambots. You need JavaScript enabled to view it.. Provjerit ćemo je.