Jak zapobiegać atakom zanieczyszczeń prototypami?

Jak Zapobiegac Atakom Zanieczyszczen Prototypami



Atak typu zanieczyszczenie prototypów wykorzystuje sposób, w jaki obiekty JavaScript radzą sobie z odpowiadającymi im prototypami. W JavaScript prototypy to kolejny obiekt definiujący domyślne właściwości i metody wybranego obiektu. Osoba atakująca wykorzystuje zanieczyszczenie prototypów, wstrzykując do tych prototypów złośliwy kod, manipulując właściwościami obiektu lub używając funkcji, która rekurencyjnie łączy obiekty.

W tym przewodniku opisano sposoby zapobiegania atakom polegającym na zanieczyszczeniu prototypów.







Zapobiegać atakom zanieczyszczeń prototypami?

Główną przyczyną ataków polegających na zanieczyszczeniu prototypów jest to, że obiekty JavaScript dziedziczą właściwości swojego prototypu. Oznacza to, że jeśli atakujący może wstrzyknąć do prototypu szkodliwy kod, zostanie on odziedziczony przez wszystkie obiekty, które odziedziczyły po tym prototypie. Prowadzi to do kradzieży danych, wykonania dowolnego kodu lub przejęcia kontroli nad innymi aplikacjami.



W poniższym fragmencie kodu zostanie wstrzyknięty prototypowy kod zanieczyszczenia:



stała y = { A: 1 , B: 2 } ;
stałe dane = JSON.parse ( '{'__proto__': { 'błędny': prawda}}' ) ;

const c = przypisanie obiektu ( { } , i, dane ) ;
konsola.log ( c. wadliwy ) ;


Opis powyższego fragmentu kodu:





    • Najpierw lista o nazwie „ I ” jest tworzony i przechowuje wartości w parze klucz-wartość.
    • Z pomocą ' -W związku z tym- ”, losowy zanieczyszczony kod jest zaimplementowany w formacie klucz-wartość. Klucz jest ustawiony na „ uszkodzony ” i przypisaną wartość „ PRAWDA ”.
    • Następnie ten zanieczyszczony kod jest przypisywany do „ I ”, wywołując listę „ przydzielać() ”, a wynikowa lista jest zapisywana na nowej liście o nazwie „ C ”.
    • Wreszcie wstrzyknięty zanieczyszczony kod w „ C ” zostanie pobrana lista, a jej wartość zostanie wyświetlona w konsoli. Aby mieć pewność, że wstrzyknięto zanieczyszczenia lub złośliwe dane.

Po wykonaniu pliku zawierającego dane wyjściowe wskazują, że złośliwy kod został pomyślnie wstrzyknięty i pobrano jego wartość:



Jak zapobiegać atakom zanieczyszczeń prototypami?

Istnieje kilka podejść, dzięki którym można zapobiec prototypowemu atakowi zanieczyszczeń:

Niebezpieczne łączenia rekurencyjne:

Unikaj niepewnych rekursywnych łączeń, ponieważ mogą one prowadzić do prototypowych ataków typu „zanieczyszczenia”:

gdzie scalić = ( trwa , sr ) = > {
Do ( atrybuty var W źródło ) {
Jeśli ( typ ( trwa [ atrybuty ] ) === „obiekt” && typ ( źródło [ atrybuty ] ) === „obiekt” )
{
łączyć ( trwa [ atrybuty ] , sr [ atrybuty ] ) ;
} w przeciwnym razie {
trwa [ atrybuty ] = źródło [ atrybuty ] ;
}
}
powrót trwa ;
} ;


W powyższym kodzie:

    • Po pierwsze, funkcja niestandardowa „ łączyć() ”, który akceptuje dwa parametry tablicowe „ trwa ' I ' źródło ”.
    • Udoskonalony „ Do ” Pętla służy do iteracji zmiennej „ atrybuty ”nad podanym” źródło parametr.
    • Wewnątrz pętli użyj „ Jeśli ”, która przegląda oba błędy i sprawdza, czy jakikolwiek element znajdujący się w obu tablicach ma ten sam typ danych. Następnie elementy te są przekazywane jako parametry do tego samego „ łączyć() ” funkcja tworząca charakter rekurencyjny.
    • Jeśli typy nie są takie same, wartość elementu znajdująca się w „ źródło ” tablica parametrów jest przekazywana do „ trwa parametr.
    • Wreszcie „ trwa ” zostanie zwrócona tablica parametryczna.

Zamrożenie prototypu

Innym sposobem zapobiegania atakom polegającym na zanieczyszczeniu prototypów jest zamrożenie ich cyklu wykonania. Odbywa się to poprzez „ Obiekt.freeze() ' metoda. W poniższym fragmencie powyższy wstrzyknięty prototyp zanieczyszczonego kodu zostanie zamrożony:

stała y = { A: 1 , B: 2 } ;
stałe dane = JSON.parse ( '{'__proto__': { 'błędny': prawda}}' ) ;

const c = przypisanie obiektu ( { } , i, dane ) ;
konsola.log ( c. wadliwy ) ;

konsola.log ( Obiekt.zamrożony ( c. wadliwy ) ) ;
konsola.log ( Obiekt.jestzamrożony ( c. wadliwy ) ) ;


Wyjaśnienie powyższego kodu pokazano poniżej:

    • Początkowo na listę fałszywych prototypów zostanie wstrzyknięty zanieczyszczony kod „ I ” tak jak wyjaśniono w powyższej sekcji.
    • Następnie wstrzyknięty zanieczyszczony klucz „ uszkodzony ” jest przekazywane do „ zamrażać() ” metoda zamrażania zanieczyszczonej części.
    • Na koniec, aby potwierdzić część zanieczyszczeń zamrożonego prototypu. „ uszkodzony „klucz listy” C ” jest przekazywane do „ jest zamarznięty() ' metoda. Ta metoda zwraca „ PRAWDA ” w przypadku zamrożonych i „ FAŁSZ ” w przypadku niezamrożonego:

Po wykonaniu kodu zawierającego dane wyjściowe pokazują, że wstrzykiwanie, zamrażanie i weryfikacja zamrożonego, zanieczyszczonego kodu:


Dodatkowe wskazówki dotyczące zapobiegania atakom związanym z zanieczyszczeniem prototypów

Poniżej podano kilka dodatkowych wskazówek, dzięki którym można zapobiec atakowi zanieczyszczeń prototypu:

    • Opcja „ –wyłącz-proto ” może zostać użyte do wyłączenia lub zakończenia działania „ prototyp.__proto__ ' nieruchomość.
    • Nie używaj metod za pomocą „ prototyp ”.
    • Przez ' Oczyszczanie danych wejściowych użytkownika ”, co obejmuje sprawdzanie i filtrowanie danych wejściowych użytkownika w celu usunięcia złośliwego lub zanieczyszczonego kodu.
    • Zastosowanie ' biała lista ”, czyli lista dozwolonych właściwości i metod obiektu. Wszelkie próby ustawienia lub pobrania właściwości lub metod, które nie są członkami białej listy, zostaną zablokowane.

Chodzi o zapobieganie atakom typu „zanieczyszczenia” w Node.js.

Wniosek

Aby zapobiec atakom polegającym na zanieczyszczeniu prototypu, stosuje się podejścia takie jak unikanie niepewnych rekursywnych łączeń, zamrażanie prototypu i używanie białej listy w celu zapobiegania „ __W związku z tym__ ” Można użyć ustawionej właściwości. Wraz z wykorzystaniem „ –wyłącz-proto ”, unikając używania „ Obiekt.prototyp ', I ' oczyszczanie danych wejściowych użytkownika ” dla zanieczyszczonego kodu. Ten przewodnik ilustruje zapobieganie prototypowym atakom zanieczyszczającym w Nodejs.