När systemet glömmer fråga: “Får du verkligen se det här?”
I ett säkert system är det inte bara viktigt att veta vem som är inloggad, utan också vad den användaren får göra. Åtkomstkontroll är det som ser till att en användare bara får se och påverka det som är relevant för den rollen. En elev ska inte kunna se en annan elevs betyg, och en vanlig användare ska inte kunna radera andras konton.
Men ibland glöms den kontrollen bort. Det kan bero på felkonfigurerade roller, API:er som inte verifierar användarens rättigheter, eller att systemet litar för mycket på information som kommer från klienten. Då räcker det ibland med att ändra ett ID i URL:en för att få åtkomst till någon annans information.
Det är precis vad som hände i ett uppmärksammat fall i svensk offentlig sektor.
Ett konkret exempel: Skolverkets provplattform
När Skolverket skulle lansera en ny digital provplattform upptäcktes allvarliga åtkomstbrister. Enligt rapporteringen kunde inloggade lärare se elevuppgifter från helt andra skolor, trots att de inte borde ha tillgång till dessa. Den här typen av informationsläckage strider både mot GDPR och grundläggande principer för IT-säkerhet.
Lanseringen stoppades i sista stund och incidenten rapporterades till Integritetsskyddsmyndigheten. Felet låg inte i inloggningssystemet eller autentiseringen, utan i brist på korrekt behörighetskontroll, ett klassiskt exempel på bristande åtkomstkontroll.
Hur allvarligt kan det bli?
Brister i åtkomstkontroll är en av få sårbarheter som direkt kan leda till att känslig information exponeras, även om allt annat är korrekt säkrat. Det spelar ingen roll hur stark lösenordspolicy du har, eller hur mycket data du krypterar, om systemet visar fel data för fel användare.
Konsekvenserna kan bli stora: dataläckor, förlorat förtroende, böter, juridiska påföljder och i värsta fall, manipulation av kritiska resurser. I molnbaserade applikationer och API-first-arkitekturer är detta ett särskilt stort problem, eftersom åtkomstkontroll ofta måste implementeras konsekvent på flera nivåer.
Varför händer det här?
Det finns flera orsaker till att behörighetskontroller brister. Ofta beror det på att utvecklingsteamet fokuserar på att bygga funktionalitet och glömmer frågan om vem som ska få använda den. Ibland finns kontrollen på ett ställe (till exempel i användargränssnittet), men saknas i backend. Det händer också att olika team implementerar åtkomstregler olika, vilket leder till inkonsekventa kontroller.
I vissa system är roller och behörigheter så komplexa att det är svårt att överblicka vilka regler som egentligen gäller. Och när man litar på information från klienten utan att kontrollera det i servern, till exempel att användarens ID skickas i ett formulär, är risken stor att någon utnyttjar det.
Hur skyddar vi oss?
Det viktigaste skyddet mot bristande åtkomstkontroller är att tänka i termer av affärslogik och konsekvent verifiering, inte bara teknisk identitet. Här är några viktiga åtgärder:
1. Minsta privilegium (Least Privilege)
Ge användare bara de rättigheter de absolut behöver. En supporttekniker kanske behöver läsa användardata, men ska inte kunna ändra lösenord eller ta bort konton. Rollen ska begränsa vilka funktioner, resurser och data som användaren har tillgång till.
Detta bör även följas upp med regelbunden granskning: har någon fått extra behörigheter som inte längre behövs? Finns konton med för breda åtkomsträttigheter?
2. “Deny by default”
Utgångspunkten i alla system bör vara att ingen har åtkomst till något förrän det uttryckligen tillåts. Detta minimerar risken för att en ny funktion eller API-endpoint av misstag görs tillgänglig för obehöriga användare.
Ett REST-API bör endast tillåta att specifika autentiserade och auktoriserade klienter kan använda det. Offentlig tillgång ska inte vara standard.
3. Tydliga och återanvändbara åtkomstkontroller
Skapa centrala och enhetliga funktioner för att kontrollera åtkomst. Använd inte ad-hoc-lösningar i olika delar av applikationen. I stället bör du bygga ett robust ramverk där alla kontrollpunkter hanteras konsekvent.
Om du exempelvis har flera endpoints som kräver att användaren tillhör en viss organisation, skapa en gemensam kontrollfunktion som alltid kallas upp, så undviker du logiska misstag och glömda kontroller.
4. Undvik klientstyrd auktorisation
Lita aldrig på data som kommer från klienten. Om användaren skickar ett användar-ID i en POST-request, måste systemet själv kontrollera att användaren har rätt att agera på det ID:t. Det räcker inte att bara anta att användaren är ärlig.
5. Affärsregler som förstärkning
Inför affärsgränser i systemets logik. En användare får kanske beställa max 5 produkter per köp, eller en elev får bara se sina egna betyg. Dessa regler bör ligga i backend, inte i gränssnittet, så att de inte kan kringgås genom manipulation av anrop eller API.
6. Säkra API:er
API:er är särskilt utsatta eftersom de ofta exponerar kärnfunktioner direkt. Varje anrop bör verifieras med autentisering (till exempel tokens) och auktorisering (vad får denna användare göra?). Begränsa även CORS till specifika, betrodda domäner, och endast om det verkligen behövs.
7. Sessionshantering och tokens
Sessions-ID:n bör ogiltigförklaras när användaren loggar ut. För tokens som JWT, är det viktigt att de har kort livslängd, annars riskerar man att en kapad token ger långvarig åtkomst.
Om du ändå använder tokens med längre giltighetstid bör du följa OAuth 2.0-standarder och ha möjlighet att återkalla åtkomst, till exempel via en revocation endpoint eller med hjälp av refresh tokens.
8. Granska och testa
Manuell kodgranskning, automatiska säkerhetstester (till exempel med verktyg som OWASP ZAP eller Burp Suite) och penetrationstester är bra sätt att identifiera sårbarheter innan en angripare gör det. Testa särskilt att användare inte kan manipulera URL:er, cookies eller HTTP-anrop för att få åtkomst till förbjudna resurser.
Sammanfattning
Broken Access Control handlar inte om om användaren är inloggad, utan vad den får göra när den är det. Det är lätt att missa i komplexa system, men konsekvenserna kan bli stora.
Som utvecklare är det ditt ansvar att se till att rätt användare har rätt åtkomst och inget mer. Det handlar om att tänka i roller, verifiera varje steg och aldrig lita på att klienten gör rätt.
Vill du se hur brister i åtkomstkontroll kan utnyttjas i praktiken? Kolla in vår video där vi visar konkreta exempel och hur du kan undvika dem. [LÄNK TILL VIDEO]
Är du osäker på hur din applikation hanterar åtkomsträttigheter? Kontakta gärna vårt AppSec-team på appsec@decerno.se. Vi hjälper dig få koll på både rättigheterna och riskerna.