Об ΠΎΠ΄Π½ΠΎΠΉ уязвимости в…

Об ΠΎΠ΄Π½ΠΎΠΉ уязвимости Π²…

Π“ΠΎΠ΄ Π½Π°Π·Π°Π΄, 21 ΠΌΠ°Ρ€Ρ‚Π° 2019, Π² Π±Π°Π³ Π±Π°ΡƒΠ½Ρ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Mail.Ru Π½Π° HackerOne ΠΏΡ€ΠΈΡˆΠ΅Π» ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π±Π°Π³Ρ€Π΅ΠΏΠΎΡ€Ρ‚ ΠΎΡ‚ maxarr. ΠŸΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° (ASCII 0) Π² POST-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· API-запросов Π²Π΅Π±-ΠΏΠΎΡ‡Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» HTTP-Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚, Π² Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° виднСлись куски Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‡Π°Ρ‰Π΅ всСго Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Π»ΠΈΡΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· GET-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΡ… запросов ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ сСрвСру.

Π­Ρ‚ΠΎ критичСская ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, Ρ‚.ΠΊ. запросы содСрТат Π² Ρ‚ΠΎΠΌ числС сСссионныС ΠΊΡƒΠΊΠΈ. Π§Π΅Ρ€Π΅Π· нСсколько часов Π±Ρ‹Π» сдСлан Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ фикс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π» Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ (ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, этого Π±Ρ‹Π»ΠΎ нСдостаточно, Ρ‚.ΠΊ. ΠΎΡΡ‚Π°Π²Π°Π»Π°ΡΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ CRLF /ASCII 13, 10, Ρ‡Ρ‚ΠΎ позволяСт ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ HTTP-ΠΎΡ‚Π²Π΅Ρ‚Π°, это ΠΌΠ΅Π½Π΅Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ, Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ нСприятно). ΠžΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с этим ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°ΠΌ бСзопасности ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ для поиска ΠΈ устранСния ΠΏΡ€ΠΈΡ‡ΠΈΠ½ возникновСния Π±Π°Π³Π°.

ΠŸΠΎΡ‡Ρ‚Π° Mail.ru β€” это ΠΎΡ‡Π΅Π½ΡŒ нСпростоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ большоС количСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄/Π±Π΅ΠΊΠ΅Π½Π΄-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ опСнсорсных (большоС спасибо всСм Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ свободного ПО), Ρ‚Π°ΠΊ ΠΈ собствСнной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Удалось ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΡ€ΠΎΠΌΠ΅ nginx ΠΈ openresty ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ngx.req.set_uri() Π² OpenResty-скриптС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Π» сСбя Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ оТидалось (Π²ΠΎΡ‚ΠΊΠ½ΡƒΡ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки Ρ‡Π΅Ρ€Π΅Π· GET-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ с rewrite Π² ngx_http_rewrite_module, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, согласно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ, казалось Π±Ρ‹, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π½Π΅ получится). Π‘Ρ‹Π»ΠΈ устранСны Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ послСдствия, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° максимально строгая Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΈ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ устраняСт всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹. Но ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ содСрТимого памяти Ρ‚Π°ΠΊ ΠΈ остался Π·Π°Π³Π°Π΄ΠΊΠΎΠΉ. Π§Π΅Ρ€Π΅Π· мСсяц Π±Π°Π³Ρ€Π΅ΠΏΠΎΡ€Ρ‚ Π·Π°ΠΊΡ€Ρ‹Π»ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ, Π° Ρ€Π°Π·Π±ΠΎΡ€ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ возникновСния Π±Π°Π³Π° ΠΎΡ‚Π»ΠΎΠΆΠΈΠ»ΠΈ Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½.

OpenResty β€” это вСсьма популярный ΠΏΠ»Π°Π³ΠΈΠ½, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΈΡΠ°Ρ‚ΡŒ Lua-скрипты Π²Π½ΡƒΡ‚Ρ€ΠΈ nginx, ΠΈ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Mail.ru, поэтому ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Π»Π°ΡΡŒ Ρ€Π΅ΡˆΠ΅Π½Π½ΠΎΠΉ. И спустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΊ Π½Π΅ΠΉ всС-Ρ‚Π°ΠΊΠΈ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ истинныС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ послСдствия ΠΈ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π’ раскопках исходного ΠΊΠΎΠ΄Π° участвовали ДСнис ДСнисов ΠΈ Николай Π•Ρ€ΠΌΠΈΡˆΠΊΠΈΠ½. Π’Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ Ρ‡Ρ‚ΠΎ:

  • Π’ nginx ΠΏΡ€ΠΈ использовании rewrite с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ directory traversal (ΠΈ вСроятно SSRF) Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… конфигурациях, Π½ΠΎ это извСстный Ρ„Π°ΠΊΡ‚, ΠΈ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ статичСскими Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ Π² Nginx Amplify ΠΈ Gixy ΠΎΡ‚ ЯндСкс (Π΄Π°, ΠΌΡ‹ Π΅Π³ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ, спасибо). ΠŸΡ€ΠΈ использовании OpenResty Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Π½ΠΎ Π½Π°ΡˆΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ это Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π»ΠΎ.

    ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

    location ~ /rewrite {
        rewrite ^.*$ $arg_x;
    }
    
    location / {
        root html;
        index index.html index.htm;
    }

    Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

    curl localhost:8337/rewrite?x=/../../../../../../../etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    ...

  • Π’ nginx Π΅ΡΡ‚ΡŒ ошибка, приводящая ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ содСрТимого памяти, Ссли строка rewrite содСрТит Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚. ΠŸΡ€ΠΈ ΠΎΡ‚Π΄Π°Ρ‡Π΅ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° nginx выдСляСт Π½ΠΎΠ²Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ памяти, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Π΅ строкС, Π½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΡƒΠ΄Π° строку Ρ‡Π΅Ρ€Π΅Π· ΡΡ‚Ρ€ΠΎΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ являСтся Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€ΠΎΠΌ строки, поэтому строка копируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°, остаток Π±ΡƒΡ„Π΅Ρ€Π° содСрТит Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

    ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (^@ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚)

    
    location ~ /memleak {
        rewrite ^.*$ "^@asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdasdf";
    }
    
    location / {
        root html;
        index index.html index.htm;
    }

    Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
    curl localhost:8337/secret -vv
    ...
    curl localhost:8337/memleak -vv
    ...
    Location: http://localhost:8337/secret
    ...

  • Nginx Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ GET-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΡ‚ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ слуТСбных символов ΠΈ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² rewrite Ρ‚ΠΎΠ»ΡŒΠΊΠΎ GET-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² nginx Π½Π΅ получаСтся. POST ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΈ этом Π½Π΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹. OpenResty позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ с GET ΠΈ с POST ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, поэтому ΠΏΡ€ΠΈ использовании POST ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· OpenResty появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов.

    ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

    location ~ /memleak {
        rewrite_by_lua_block {
            ngx.req.read_body();
            local args, err = ngx.req.get_post_args();
            ngx.req.set_uri( args["url"], true );
        }
    }
    
    location / {
        root html;
        index index.html index.htm;
    }
    

    Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

    curl localhost:8337 -d "url=secret" -vv
    ...
    curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
    ...
    Location: http://localhost:8337/{...ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ secret...}
    ...

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ рСакция

О ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ сообщили Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ nginx ΠΈ OpenResty, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΊΠ°ΠΊ ΠΎΡˆΠΈΠ±ΠΊΡƒ бСзопасности Π² nginx, Ρ‚.ΠΊ. Π² самом nginx Π½Π΅Ρ‚ возмоТности эксплуатации ошибки Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ спСцсимволов, фикс раскрытия содСрТимого памяти Π±Ρ‹Π» ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ 16 дСкабря. Π—Π° 4 мСсяца с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Ρ€Π΅ΠΏΠΎΡ€Ρ‚Π° Π² OpenResty Ρ‚Π°ΠΊ ΠΆΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ сдСлано ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, хотя Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ бСзопасный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ngx.req.set_uri(). 18 ΠΌΠ°Ρ€Ρ‚Π° 2020 ΠΌΡ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, 21 ΠΌΠ°Ρ€Ρ‚Π° OpenResty выпустила Π²Π΅Ρ€ΡΠΈΡŽ 1.15.8.3, которая добавляСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ URI.

Portswigger написал Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΈ взял ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Ρƒ OpenResty ΠΈ Nginx (ΠΏΡ€Π°Π²Π΄Π° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ раскрываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ памяти являСтся Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, это опрСдСляСтся Π΄Π»ΠΈΠ½ΠΎΠΉ строки, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π° Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ ΠΈ, ΠΏΡ€ΠΈ отсутствии явных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° Π΄Π»ΠΈΠ½Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΌ).

Π’Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ Π±Ρ‹Π»Π° ошибка ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ?

Π‘Ρ‹Π»Π° Π»ΠΈ ошибка Π² nginx? Π”Π°, Π±Ρ‹Π»Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° содСрТимого памяти это Π² любом случаС ошибка.

Π‘Ρ‹Π»ΠΈ Π»ΠΈ ошибка Π² OpenResty? Π”Π°, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π΅ Π±Ρ‹Π» исслСдован ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ вопрос ΠΎ бСзопасности ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΉ OpenResty Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π‘Ρ‹Π»Π° Π»ΠΈ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° ошибка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ / использования OpenResty? Π”Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² отсутствии явного указания, Π±Ρ‹Π»ΠΎ сдСлано Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ бСзопасности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Какая ΠΈΠ· этих ошибок являСтся ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ бСзопасности с Π±Π°ΡƒΠ½Ρ‚ΠΈ Π½Π° $10000? Для нас это Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ. Π’ любом ПО, особСнно Π½Π° стыкС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, особСнно прСдоставляСмых Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Π½ΠΈΠΊΡ‚ΠΎ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС особСнности ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ извСстны ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ошибки. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ любая ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ бСзопасности Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½Π° влияСт Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.

Π’ любом случаС, Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ максимально ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ/Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ уходят Π² любой внСшний ΠΌΠΎΠ΄ΡƒΠ»ΡŒ/API, Ссли Π½Π΅Ρ‚ явных ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ ΠΈ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ³ΠΎ понимания, Ρ‡Ρ‚ΠΎ этого Π½Π΅ трСбуСтся.

Errata

По ΠΎΠΏΡ‹Ρ‚Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Ρ€Π°Π΄ΠΈ сохранСния чистоты языка:

Π±Π°Π³ Π±Π°ΡƒΠ½Ρ‚ΠΈ β€” конкурс ΠΎΡ…ΠΎΡ‚Ρ‹ Π·Π° ошибками
Π±Π°Π³Ρ€Π΅ΠΏΠΎΡ€Ρ‚ β€” ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС
Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚ β€” ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅
опСнсорсный β€” с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
errata β€” Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ ошибками

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ