Angular
The Checklist
Checklist from here.
What is Angular
Angular je moćan i open-source front-end framework koji održava Google. Koristi TypeScript za poboljšanje čitljivosti koda i debagovanja. Sa jakim bezbednosnim mehanizmima, Angular sprečava uobičajene ranjivosti sa strane klijenta kao što su XSS i otvoreni preusmeravanja. Može se koristiti i na server-side, što čini bezbednosne aspekte važnim iz oba ugla.
Framework architecture
Da bismo bolje razumeli osnove Angular-a, hajde da prođemo kroz njegove suštinske koncepte.
Uobičajeni Angular projekat obično izgleda ovako:
Prema dokumentaciji, svaka Angular aplikacija ima barem jednu komponentu, korensku komponentu (AppComponent
) koja povezuje hijerarhiju komponenti sa DOM-om. Svaka komponenta definiše klasu koja sadrži podatke i logiku aplikacije, i povezana je sa HTML šablonom koji definiše prikaz koji će biti prikazan u ciljanom okruženju. Dekorator @Component()
identifikuje klasu odmah ispod njega kao komponentu, i pruža šablon i povezane metapodatke specifične za komponentu. AppComponent
je definisan u app.component.ts
datoteci.
Angular NgModules deklariraju kontekst kompilacije za skup komponenti koji je posvećen domenu aplikacije, radnom toku ili usko povezanim skupovima mogućnosti. Svaka Angular aplikacija ima korenski modul, konvencionalno nazvan AppModule
, koji pruža mehanizam za pokretanje koji pokreće aplikaciju. Aplikacija obično sadrži mnoge funkcionalne module. AppModule
je definisan u app.module.ts
datoteci.
Angular Router
NgModule pruža uslugu koja vam omogućava da definišete navigacioni put među različitim stanjima aplikacije i hijerarhijama prikaza u vašoj aplikaciji. RouterModule
je definisan u app-routing.module.ts
datoteci.
Za podatke ili logiku koja nije povezana sa specifičnim prikazom, i koju želite da delite među komponentama, kreirate klasu usluge. Definicija klase usluge odmah prethodi dekoratoru @Injectable()
. Dekorator pruža metapodatke koji omogućavaju drugim provajderima da budu injektovani kao zavisnosti u vašu klasu. Injekcija zavisnosti (DI) vam omogućava da zadržite klase komponenti vitkim i efikasnim. One ne preuzimaju podatke sa servera, ne validiraju korisnički unos, niti direktno beleže u konzolu; one delegiraju takve zadatke uslugama.
Konfiguracija sourcemap-a
Angular okvir prevodi TypeScript datoteke u JavaScript kod prateći tsconfig.json
opcije i zatim gradi projekat sa angular.json
konfiguracijom. Gledajući angular.json
datoteku, primetili smo opciju za omogućavanje ili onemogućavanje sourcemap-a. Prema Angular dokumentaciji, podrazumevana konfiguracija ima sourcemap datoteku omogućenu za skripte i nije skrivena po defaultu:
Generalno, sourcemap datoteke se koriste za svrhe debagovanja jer mapiraju generisane datoteke na njihove originalne datoteke. Stoga, nije preporučljivo koristiti ih u produkcionom okruženju. Ako su sourcemaps omogućeni, poboljšava se čitljivost i pomaže u analizi datoteka replicirajući originalno stanje Angular projekta. Međutim, ako su onemogućeni, recenzent može još uvek ručno analizirati kompajliranu JavaScript datoteku pretražujući anti-bezbednosne obrasce.
Pored toga, kompajlirana JavaScript datoteka sa Angular projektom može se pronaći u alatima za razvoj preglednika → Izvori (ili Debager i Izvori) → [id].main.js. U zavisnosti od omogućenih opcija, ova datoteka može sadržati sledeći red na kraju //# sourceMappingURL=[id].main.js.map
ili možda neće, ako je opcija hidden postavljena na true. Ipak, ako je sourcemap onemogućen za scripts, testiranje postaje složenije i ne možemo dobiti datoteku. Pored toga, sourcemap može biti omogućen tokom izgradnje projekta kao ng build --source-map
.
Data binding
Binding se odnosi na proces komunikacije između komponente i njenog odgovarajućeg prikaza. Koristi se za prenos podataka ka i od Angular okvira. Podaci se mogu prenositi na različite načine, kao što su događaji, interpolacija, svojstva ili putem mehanizma dvosmernog povezivanja. Štaviše, podaci se takođe mogu deliti između povezanih komponenti (odnos roditelj-dete) i između dve nepovezane komponente koristeći funkciju Servis.
Možemo klasifikovati binding prema protoku podataka:
Izvor podataka ka cilju prikaza (uključuje interpolaciju, svojstva, atribute, klase i stilove); može se primeniti korišćenjem
[]
ili{{}}
u šablonu;Cilj prikaza ka izvoru podataka (uključuje događaje); može se primeniti korišćenjem
()
u šablonu;Dvosmerno; može se primeniti korišćenjem
[()]
u šablonu.
Binding se može pozvati na svojstvima, događajima i atributima, kao i na bilo kojem javnom članu izvorne direktive:
Svojstvo
Svojstvo elementa, Svojstvo komponente, Svojstvo direktive
<img [alt]="hero.name" [src]="heroImageUrl">
Događaj
Događaj elementa, Događaj komponente, Događaj direktive
<button type="button" (click)="onSave()">Sačuvaj
Dvosmerno
Događaj i svojstvo
<input [(ngModel)]="name">
Atribut
Atribut (izuzetak)
<button type="button" [attr.aria-label]="help">pomoć
Klasa
svojstvo klase
<div [class.special]="isSpecial">Specijal
Stil
svojstvo stila
<button type="button" [style.color]="isSpecial ? 'red' : 'green'">
Angular security model
Dizajn Angular-a uključuje kodiranje ili sanitizaciju svih podataka po defaultu, čineći sve teže otkriti i iskoristiti XSS ranjivosti u Angular projektima. Postoje dva različita scenarija za rukovanje podacima:
Interpolacija ili
{{user_input}}
- vrši kodiranje osetljivo na kontekst i tumači korisnički unos kao tekst;
Rezultat: <script>alert(1)</script><h1>test</h1>
2. Povezivanje sa svojstvima, atributima, klasama i stilovima ili [attribute]="user_input"
- vrši sanitizaciju na osnovu pruženog sigurnosnog konteksta.
Rezultat: <div><h1>test</h1></div>
Postoji 6 tipova SecurityContext
:
None
;HTML
se koristi kada se tumači vrednost kao HTML;STYLE
se koristi kada se povezuje CSS ustyle
svojstvo;URL
se koristi za URL svojstva, kao što je<a href>
;SCRIPT
se koristi za JavaScript kod;RESOURCE_URL
kao URL koji se učitava i izvršava kao kod, na primer, u<script src>
.
Vulnerabilities
Bypass Security Trust methods
Angular uvodi listu metoda za zaobilaženje svog defaultnog procesa sanitizacije i za označavanje da se vrednost može sigurno koristiti u određenom kontekstu, kao u sledećih pet primera:
bypassSecurityTrustUrl
se koristi za označavanje da je data vrednost siguran stil URL:
bypassSecurityTrustResourceUrl
se koristi za označavanje da je data vrednost siguran resurs URL:
bypassSecurityTrustHtml
se koristi za označavanje da je data vrednost siguran HTML. Imajte na umu da umetanjescript
elemenata u DOM stablo na ovaj način neće uzrokovati njihovo izvršavanje zatvorenog JavaScript koda, zbog načina na koji se ovi elementi dodaju u DOM stablo.
bypassSecurityTrustScript
se koristi za označavanje da je data vrednost siguran JavaScript. Međutim, otkrili smo da je njegovo ponašanje nepredvidivo, jer nismo mogli da izvršimo JS kod u šablonima koristeći ovu metodu.
bypassSecurityTrustStyle
se koristi za označavanje da je data vrednost siguran CSS. Sledeći primer ilustruje CSS injekciju:
Angular pruža metodu sanitize
za sanitizaciju podataka pre nego što ih prikaže u prikazima. Ova metoda koristi pruženi sigurnosni kontekst i čisti unos u skladu s tim. Međutim, ključno je koristiti ispravan sigurnosni kontekst za specifične podatke i kontekst. Na primer, primena sanitizatora sa SecurityContext.URL
na HTML sadržaj ne pruža zaštitu od opasnih HTML vrednosti. U takvim scenarijima, zloupotreba sigurnosnog konteksta može dovesti do XSS ranjivosti.
HTML injection
Ova ranjivost se javlja kada je korisnički unos povezan sa bilo kojim od tri svojstva: innerHTML
, outerHTML
, ili iframe
srcdoc
. Dok povezivanje sa ovim atributima tumači HTML onako kako jeste, unos se sanitizuje koristeći SecurityContext.HTML
. Tako, HTML injekcija je moguća, ali cross-site scripting (XSS) nije.
Primer korišćenja innerHTML
:
Rezultat je <div><h1>test</h1></div>
.
Ubrizgavanje šablona
Renderovanje na klijentskoj strani (CSR)
Angular koristi šablone za dinamičko konstruisanje stranica. Ovaj pristup podrazumeva obuhvatanje izraza šablona koje Angular treba da proceni unutar dvostrukih vitičastih zagrada ({{}}
). Na ovaj način, okvir nudi dodatnu funkcionalnost. Na primer, šablon kao što je {{1+1}}
biće prikazan kao 2.
Obično, Angular escapuje korisnički unos koji se može pomešati sa izrazima šablona (npr. karakteri kao što su `< > ' " ``). To znači da su potrebni dodatni koraci da se zaobiđe ovo ograničenje, kao što je korišćenje funkcija koje generišu JavaScript string objekte kako bi se izbeglo korišćenje zabranjenih karaktera. Međutim, da bismo to postigli, moramo uzeti u obzir Angular kontekst, njegove osobine i promenljive. Stoga, napad ubrizgavanja šablona može izgledati ovako:
Kao što je prikazano iznad: constructor
se odnosi na opseg svojstva objekta constructor
, omogućavajući nam da pozovemo String konstruktor i izvršimo proizvoljan kod.
Renderovanje na serveru (SSR)
Za razliku od CSR, koje se dešava u DOM-u pregledača, Angular Universal je odgovoran za SSR datoteka šablona. Ove datoteke se zatim isporučuju korisniku. I pored ove razlike, Angular Universal primenjuje iste mehanizme sanitizacije koji se koriste u CSR kako bi poboljšao sigurnost SSR-a. Ranljivost injekcije šablona u SSR može se uočiti na isti način kao u CSR, jer je korišćeni jezik šablona isti.
Naravno, postoji i mogućnost uvođenja novih ranjivosti injekcije šablona kada se koriste treće strane šablonski motori kao što su Pug i Handlebars.
XSS
DOM interfejsi
Kao što je prethodno navedeno, možemo direktno pristupiti DOM-u koristeći Document interfejs. Ako korisnički unos nije prethodno validiran, to može dovesti do ranjivosti skriptovanja između sajtova (XSS).
Koristili smo document.write()
i document.createElement()
metode u primerima ispod:
Angular klase
Postoje neke klase koje se mogu koristiti za rad sa DOM elementima u Angular-u: ElementRef
, Renderer2
, Location
i Document
. Detaljan opis poslednje dve klase dat je u sekciji Open redirects. Glavna razlika između prve dve je u tome što Renderer2
API pruža sloj apstrakcije između DOM elementa i koda komponente, dok ElementRef
samo drži referencu na element. Stoga, prema Angular dokumentaciji, ElementRef
API treba koristiti samo kao poslednje sredstvo kada je potreban direktan pristup DOM-u.
ElementRef
sadrži svojstvonativeElement
, koje se može koristiti za manipulaciju DOM elementima. Međutim, nepravilna upotrebanativeElement
može rezultirati ranjivošću na XSS injekciju, kao što je prikazano u nastavku:
I pored toga što
Renderer2
pruža API koji se može sigurno koristiti čak i kada direktan pristup nativnim elementima nije podržan, i dalje ima neke sigurnosne nedostatke. SaRenderer2
, moguće je postaviti atribute na HTML element koristeći metodusetAttribute()
, koja nema mehanizme za prevenciju XSS-a.
Da biste postavili svojstvo DOM elementa, možete koristiti metodu
Renderer2.setProperty()
i pokrenuti XSS napad:
Tokom našeg istraživanja, takođe smo ispitivali ponašanje drugih Renderer2
metoda, kao što su setStyle()
, createComment()
, i setValue()
, u vezi sa XSS i CSS injekcijama. Međutim, nismo mogli da pronađemo validne napade za ove metode zbog njihovih funkcionalnih ograničenja.
jQuery
jQuery je brza, mala i bogata JavaScript biblioteka koja se može koristiti u Angular projektu za pomoć u manipulaciji HTML DOM objektima. Međutim, kao što je poznato, metode ove biblioteke mogu biti iskorišćene za postizanje XSS ranjivosti. Da bismo razgovarali o tome kako se neke ranjive jQuery metode mogu iskoristiti u Angular projektima, dodali smo ovu podsekciju.
Metoda
html()
dobija HTML sadržaj prvog elementa u skupu usklađenih elemenata ili postavlja HTML sadržaj svakog usklađenog elementa. Međutim, po dizajnu, svaki jQuery konstruktor ili metoda koja prihvata HTML string može potencijalno izvršiti kod. To se može dogoditi injekcijom<script>
tagova ili korišćenjem HTML atributa koji izvršavaju kod, kao što je prikazano u primeru.
Metoda
jQuery.parseHTML()
koristi nativne metode za konvertovanje stringa u skup DOM čvorova, koji se zatim mogu umetnuti u dokument.
Kao što je ranije pomenuto, većina jQuery API-ja koji prihvataju HTML stringove će pokrenuti skripte koje su uključene u HTML. Metoda jQuery.parseHTML()
ne pokreće skripte u analiziranom HTML-u osim ako keepScripts
nije eksplicitno true
. Međutim, i dalje je moguće u većini okruženja izvršiti skripte indirektno; na primer, putem atributa <img onerror>
.
Open redirects
DOM interfejsi
Prema W3C dokumentaciji, objekti window.location
i document.location
se tretiraju kao aliasi u modernim pretraživačima. Zbog toga imaju sličnu implementaciju nekih metoda i svojstava, što može izazvati otvoreni preusmeravanje i DOM XSS sa javascript://
shematskim napadima, kao što je pomenuto u nastavku.
window.location.href
(idocument.location.href
)
Kanonicki način da se dobije trenutni DOM lokacijski objekat je korišćenje window.location
. Takođe se može koristiti za preusmeravanje pretraživača na novu stranicu. Kao rezultat, kontrola nad ovim objektom omogućava nam da iskoristimo ranjivost otvorenog preusmeravanja.
Proces eksploatacije je identičan za sledeće scenarije.
window.location.assign()
(idocument.location.assign()
)
Ova metoda uzrokuje da prozor učita i prikaže dokument na URL-u koji je naveden. Ako imamo kontrolu nad ovom metodom, to može biti izvor za napad otvorenog preusmeravanja.
window.location.replace()
(idocument.location.replace()
)
Ova metoda zamenjuje trenutni resurs onim na datom URL-u.
Ovo se razlikuje od assign()
metode po tome što nakon korišćenja window.location.replace()
, trenutna stranica neće biti sačuvana u istoriji sesije. Međutim, takođe je moguće iskoristiti ranjivost otvorenog preusmeravanja kada imamo kontrolu nad ovom metodom.
window.open()
Metoda window.open()
uzima URL i učitava resurs koji identifikuje u novoj ili postojećoj kartici ili prozoru. Kontrola nad ovom metodom takođe može biti prilika za pokretanje XSS ili otvorene ranjivosti preusmeravanja.
Angular klase
Prema Angular dokumentaciji, Angular
Document
je isto što i DOM dokument, što znači da je moguće koristiti zajedničke vektore za DOM dokument kako bi se iskoristile ranjivosti na klijentskoj strani u Angular-u.Document.location
svojstva i metode mogu biti izvori za uspešne napade otvorenog preusmeravanja, kao što je prikazano u primeru:
Tokom istraživačke faze, takođe smo pregledali Angular
Location
klasu za ranjivosti otvorenog preusmeravanja, ali nisu pronađeni validni vektori.Location
je Angular servis koji aplikacije mogu koristiti za interakciju sa trenutnim URL-om pretraživača. Ova usluga ima nekoliko metoda za manipulaciju datim URL-om -go()
,replaceState()
, iprepareExternalUrl()
. Međutim, ne možemo ih koristiti za preusmeravanje na eksternu domenu. Na primer:
Rezultat: http://localhost:4200/http://google.com/about
Angular
Router
klasa se prvenstveno koristi za navigaciju unutar iste domene i ne uvodi dodatne ranjivosti u aplikaciju:
Rezultat: http://localhost:4200/https:
Sledeće metode takođe navigiraju unutar domena:
Reference
Last updated