Cyber Security Academy · Lektion

Sårbarheter i formatsträngar

Exploatera printf-formatsträngar för att läsa godtyckligt minne och skriva till godtyckliga adresser.

Lektion 3 av 413 steg

Sårbarheter i formatsträngar är en gratis lektion i Cyber Security Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Cyber Security Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.

Vad är en sårbarhet i formatsträngar?

En sårbarhet i formatsträngar uppstår när användarindata skickas direkt som formatsträngsargument till printf() eller liknande funktioner. Angriparen kan läsa minne, läcka stackadresser och skriva godtyckliga värden.

Det sårbara mönstret

Sårbart kontra säkert:

// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);

// SAFE - user input is a data argument:
printf("%s", user_input);

Läsa minne med %x och %p

Formatspecifikationer utan motsvarande argument läser värden från stacken:

# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!

Kringgå ASLR med formatsträngsläckor

Stacken innehåller ofta pekare till libc, stacken och binärfilen. Genom att läcka dessa med formatspecifikationerna %p eller %lx kan en angripare beräkna basadresser och kringgå ASLR — även utan någon annan sårbarhet.

Läsa godtyckligt minne med %s

%s tolkar stackvärdet som en pekare och skriver ut strängen på den adressen. Genom att placera måladdressen på rätt position i stacken och använda parameteråtkomst (%7$s) kan en angripare läsa godtyckliga minnesadresser.

# Direct parameter access:
printf("%7$s")  # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memory

Skriva minne med %n

%n skriver antalet tecken som hittills har skrivits ut till den adress som motsvarande argument pekar på. Detta gör det möjligt att skriva kontrollerade värden till godtyckliga adresser — vilket potentiellt kan skriva över funktionspekare eller returadresser.

Praktisk skrivteknik

Så här skriver man ett specifikt värde med %n:

  1. Kontrollera en pekare på stacken som pekar på måladdressen
  2. Använd %Xc%N$n för att skriva X tecken och skriv sedan antalet till den N:te parametern (måladdressen)

Verktyg som pwntools automatiserar konstruktionen av formatsträngsexploitar.

Hitta formatsträngsbuggar

Testa om det finns sårbarheter i formatsträngar:

# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)

# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vuln

Försvar: korrigera koden

Lösningen är trivialt enkel: skicka alltid användarindata som ett dataargument, aldrig som formatsträngen.

// WRONG:
printf(buffer);

// RIGHT:
printf("%s", buffer);

// Compiler warning:
// gcc -Wformat-security will flag this

Formatsträngar i andra språk

Sårbarheter i formatsträngar förekommer i många språk:

  • C: printf(input)
  • Python: inte samma sak — men formatering med % och dict-indata kan exponera variabler
  • Java: String.format(input) — mindre farligt, ingen minnesåtkomst

Exempel från verkligheten

Formatsträngsbuggar har påverkat:

  • ProFTPD — möjliggjorde fjärrkörning av kod via FTP-kommandon
  • WU-FTPD — möjliggjorde en fjärrinriktad root-exploit via formatsträngar
  • Olika Linux-daemoner före 2000-talet

Moderna kompilatorer och FORTIFY_SOURCE hjälper, men eliminerar inte sårbarhetsklassen helt.

Snabbkontroll: formatsträngar

Vilken formatspecifikation kan användas för att skriva till en godtycklig minnesadress i en formatsträngsattack?

Sammanfattning av lektionen

Sårbarheter i formatsträngar uppstår när användarindata används direkt som formatsträng i printf. %p/%x läcker stackminne; %s läser godtyckliga adresser; %n skriver till godtyckliga adresser. Lösningen är ett enda tecken: printf("%s", input). Aktivera -Wformat-security i kompilatorflaggorna för att upptäcka dessa problem.

Gratis att börja

Lär dig Cyber Security Academy med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
303

Vanliga frågor

Är lektionen ”Sårbarheter i formatsträngar” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Cyber Security Academy, inklusive ”Sårbarheter i formatsträngar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Sårbarheter i formatsträngar”?

Exploatera printf-formatsträngar för att läsa godtyckligt minne och skriva till godtyckliga adresser. Ni övar på Cyber Security Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Cyber Security Academy?

Du behöver inga förkunskaper. Utbildningen i Cyber Security Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Sårbarheter i formatsträngar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Cyber Security Academy-lektionen?

Ja. Varje Cyber Security Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Stackbaserade buffertöverflöden
  2. Return-Oriented Programming (ROP)
  3. Sårbarheter i formatsträngar
  4. Heapexploatering: use-after-free och heap spraying
← Tillbaka till Cyber Security Academy