{"id":197,"date":"2018-02-10T23:00:12","date_gmt":"2018-02-10T22:00:12","guid":{"rendered":"https:\/\/brozanski.net\/?p=197"},"modified":"2018-02-11T12:05:20","modified_gmt":"2018-02-11T11:05:20","slug":"197","status":"publish","type":"post","link":"https:\/\/brozanski.net\/index.php\/2018\/02\/10\/197\/","title":{"rendered":"Kanonizacja &#8211; przepis na bezpieczne przetwarzanie danych"},"content":{"rendered":"<p>Ka\u017cda istniej\u0105ca aplikacja w internecie dzia\u0142a na podstawie danych jakie s\u0105 do niej wprowadzane. Podstawow\u0105 dan\u0105 jest adres zasobu, zwany og\u00f3lnie URI (Unique Resource Identificator), kt\u00f3ry jednoznacznie identyfikuje miejsce z jakiego serwer aplikacji ma pobra\u0107 zas\u00f3b. Mo\u017cliwe jest wprowadzanie danych jako parametr\u00f3w wej\u015bciowych, dodatkowo identyfikuj\u0105cych zas\u00f3b lub definiuj\u0105cych jego zachowanie.<br \/>\nTechnolgia internetowa przewiduje wiele r\u00f3\u017cnych sposob\u00f3w reprezentacji zar\u00f3wno identyfikatora zasobu, jak i warto\u015bci parametr\u00f3w wej\u015bciowych, co niestety w niekt\u00f3rych przypadkach mo\u017ce prowadzi\u0107 do powa\u017cnych luk bezpiecze\u0144stwa. Luki te zwykle polegaj\u0105 na b\u0142\u0119dnej interpretacji przez aplikacj\u0119 wprowadzanych danych.<\/p>\n<p>Co zrobi\u0107, aby nie nara\u017ca\u0107 naszej aplikacji na takie niebezpiecze\u0144stwo? Odpowiedzi\u0105 na to pytanie jest kanonizacja. Poj\u0119cie to nale\u017cy do tych naukowych i cz\u0119\u015bciej mo\u017cna si\u0119 spotka\u0107 z okre\u015bleniem normalizacji lub standaryzacji. Og\u00f3lnie rzecz bior\u0105c, proces kanonizacji polega na sprowadzaniu danego typu danych, kt\u00f3ry mo\u017ce wyst\u0119powa\u0107 w wielu formach, do pewnej &#8222;znormalizowanej&#8221; postaci. Pozwala to na uproszczenie procesu przetwarzania (np. por\u00f3wnywania podczas wyszukiwania) i unikni\u0119cie nieumy\u015blnej, b\u0142\u0119dnej ich interpretacji.<\/p>\n<p>Przed jakimi problemami bezpiecze\u0144stwa chroni normalizacja?<\/p>\n<h3>Przekierowanie \u015bcie\u017cki (Path Traversal)<\/h3>\n<p>Cz\u0119sto aplikacje pozwalaj\u0105 na dost\u0119p do pewnych zasob\u00f3w umieszczonych w systemie plik\u00f3w serwera hostuj\u0105cego lub wprost uruchamia operacje systemowe. Czasami w parametrach wywo\u0142ania podawana jest nazwa pliku lub innego zasobu np.<\/p>\n<p>https:\/\/mojastrona.com?image=bigicon.jpg<\/p>\n<p>Normalizacja\/kanonizacja w takim wypadku powinna polega\u0107 na okre\u015bleniu absolutnej \u015bcie\u017cki z jakiej zasoby podawane w parametrze <strong>image<\/strong> s\u0105 pobierane i uniemo\u017cliwienie wyj\u015bcia poza t\u0119 \u015bcie\u017ck\u0119, np.<\/p>\n<p>c:\\inetpub\\wwwroot\\images\\{doklejana nazwa pliku}<\/p>\n<p>Gdyby takiej kanonizacji nie by\u0142o mogliby\u015bmy wprowadzi\u0107 do parametru \u015bcie\u017ck\u0119 innego pliku, kt\u00f3ry akurat bardzo mocno chcieliby\u015bmy ukry\u0107 (np. &#8222;\\..\\web.config&#8221;). W taki wypadku mechanizm m\u00f3g\u0142by potraktowa\u0107 powsta\u0142\u0105 \u015bcie\u017ck\u0119 jako prawid\u0142ow\u0105 i taki plik za\u0142\u0105czy\u0107 do wynikowej strony.<\/p>\n<h3>Wstrzykni\u0119cia (Injections)<\/h3>\n<p>Normalizacja w przypadku wstrzykni\u0119\u0107 dotyczy przede wszystkim sposobu w jaki aplikacja interpretuje i przetwarza dane, kt\u00f3re mog\u0105 wyst\u0119powa\u0107 w r\u00f3\u017cnym kodowaniu. Przyk\u0142adowo warto\u015bci parametr\u00f3w w adresie zasobu (URI) mo\u017cemy kodowa\u0107 w r\u00f3\u017cnych postaciach (np. kodowanie URL, kodowanie Unicode, kodowanie UTF), tzn. \u017ce ten sam znak mo\u017ce wyst\u0119powa\u0107 w wielu r\u00f3\u017cnych postaciach (np. znak &#8222;%&#8221; mo\u017ce by\u0107 zakodowany jako &#8222;%20&#8221;, &#8222;0x20&#8221;, &#8222;0x0020&#8221;, itd). Problem polega na tym, \u017ce aplikacja musi taki znak poprawnie zdekodowa\u0107 i zinterpretowa\u0107. Mo\u017ce to prowadzi\u0107 do w\u015bwietlenia nieprawid\u0142owej tre\u015bci na wyrenderowanym widoku lub modyfikacji polece\u0144 SQL.<\/p>\n<p>Kanonizacja w takim wypadku sprowadza si\u0119 do przyj\u0119cia konkretnego formatu (kodowania) za obowi\u0105zuj\u0105cy w naszej aplikacji, pr\u00f3by przetworzenia danych do tego formatu, a w razie b\u0142\u0119du, przerwania przetwarzania i wywo\u0142ania wyj\u0105tku.<\/p>\n<p>Kwestia metod kodowania i zwi\u0105znych z nim niebezpiecze\u0144stw jest szerokim tematem i\u00a0my\u015bl\u0119, \u017ce wkr\u00f3tce pojawi si\u0119 nie jeden wpis na ten temat.<\/p>\n<h3>Atak XXE &#8211; (XML eXternal Entity attack)<\/h3>\n<p>Atak XXE jest \u015bci\u015ble zwi\u0105zany z b\u0142\u0119dnym przetwarzaniem (parsowaniem) danych w formacie XML. Atak ten polega na umieszczeniu w tre\u015bci dokumentu XML odniesienia do tzw. zewn\u0119trznych encji, kt\u00f3re nast\u0119pnie s\u0105 przetwarzane przez b\u0142\u0119dnie skonfigurowany parser XML. Atak tego rodzaju mo\u017cna wykorzysta\u0107 do przeprowadzenia ataku DoS (Denial of Service), nieautoryzowanego dost\u0119pu do wra\u017cliwych danych, czy nawet skanowania sieci lokalnej w jakiej znajduje si\u0119 serwer aplikacji.<\/p>\n<p>Opr\u00f3cz poprawnego skonfigurowania parsera XML (o czym innym razem) mo\u017cemy dokona\u0107 tzw. normalizacji wej\u015bciowego dokumentu XML. Dla dokument\u00f3w XML zosta\u0142a stworzona specjalna specyfikacja tzw.\u00a0<a href=\"https:\/\/www.w3.org\/TR\/xml-c14n11\/\" target=\"_blank\" rel=\"noopener noreferrer\">The Canonical XML Specification<\/a>. Specyfikacja ta definiuje jakie czynno\u015bci nale\u017cy wykona\u0107 na dokumencie, aby sprowadzi\u0107 go do postaci kanonicznej.<\/p>\n<p>Przyk\u0142adowymi czynno\u015bciami normalizacyjnymi s\u0105:<\/p>\n<ul>\n<li>usuwanie bia\u0142ych znak\u00f3w z nazw tag\u00f3w<\/li>\n<li>kodowanie dokumentu do UTF-8<\/li>\n<li>usuwanie sekcji CDATA i zast\u0105pienie ich w\u0142a\u015bciwym kontentem<\/li>\n<li>zast\u0105pienie samozamykaj\u0105cych si\u0119 tag\u00f3w osobnymi tagami otwarcia i zamkni\u0119cia<\/li>\n<li>itd<\/li>\n<\/ul>\n<p>Po szczeg\u00f3\u0142y polecam zajrze\u0107 pod wspomniany wy\u017cej link.<\/p>\n<h3>Inne zastosowania kanonizacji<\/h3>\n<p>Poza ochron\u0105 normalizacja mo\u017ce by\u0107 wykorzystywana do zada\u0144, kt\u00f3re optymalizuj\u0105 metody analizy danych, jak na przyk\u0142ad indeksowanie na potrzeby wyszukiwania (SEO), czy te\u017c podczas analizy leksykograficznej, gdy uwsp\u00f3lniamy znaczenie s\u0142\u00f3w w r\u00f3\u017cnych formach gramatycznych, np. s\u0142owo &#8222;drzewo&#8221; i jego r\u00f3\u017cne odmiany, jak: &#8222;drzewa&#8221;, &#8222;drzew&#8221;, &#8222;drzewem&#8221;, itd.<\/p>\n<h3>Podsumowanie<\/h3>\n<p>Ka\u017cda aplikacja przetwarza jakie\u015b dane. Aby uchroni\u0107 si\u0119 przed problemami, warto czasami przemy\u015ble\u0107, jakie dane przetwarzamy i czy jest mo\u017cliwe takie ich sformatowanie, aby nasze algorytmy nie musia\u0142y by\u0107 zbyt skomplikowane i nie generowa\u0142y dodatkowych problem\u00f3w (np. podatno\u015bci bezpiecze\u0144stwa).<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ka\u017cda istniej\u0105ca aplikacja w internecie dzia\u0142a na podstawie danych jakie s\u0105 do niej wprowadzane. Podstawow\u0105 dan\u0105 jest adres zasobu, zwany og\u00f3lnie URI (Unique Resource Identificator), kt\u00f3ry jednoznacznie identyfikuje miejsce z jakiego serwer aplikacji ma pobra\u0107 zas\u00f3b. Mo\u017cliwe jest wprowadzanie danych jako parametr\u00f3w wej\u015bciowych, dodatkowo identyfikuj\u0105cych zas\u00f3b lub definiuj\u0105cych jego zachowanie. Technolgia internetowa przewiduje wiele r\u00f3\u017cnych\u2026 <span class=\"read-more\"><a href=\"https:\/\/brozanski.net\/index.php\/2018\/02\/10\/197\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[26],"class_list":["post-197","post","type-post","status-publish","format-standard","hentry","category-security","tag-miroburn_challenge"],"_links":{"self":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts\/197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/comments?post=197"}],"version-history":[{"count":4,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts\/197\/revisions"}],"predecessor-version":[{"id":201,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts\/197\/revisions\/201"}],"wp:attachment":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/media?parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/categories?post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/tags?post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}