Øvelse 15 – Forstå koden
Forfatter: Mathias Greisen
Dato: 2026-09-21
Fag/modul: Softwaresikkerhed
Status: Færdig
1. Beskrivelse af øvelsen
Øvelsen går ud på at læse og forstå en given implementeret kode for derefter at vurdere, om koden kan føre til sikkerhedsmæssige sårbarheder. Formålet er at træne sammenhængen mellem kodens tekniske funktion og det domæne, koden arbejder indenfor — da en reel sikkerhedsvurdering kræver forståelse af begge dele.
2. Reproduktion trin for trin
Trin/Delopgave beskrivelse
1. Klon repositoriet
```bash
git clone https://github.com/mesn1985/missingDomain
cd missingDomain
```
2. Gennemgå koden og forsøg at forstå, hvad koden gør
Koden starter med at køre program.cs. Ud fra denne kan vi set at der oprettes et BA objekt.
Ved kig i BA.cs ser man det der ligner et objekt for en bank konto (bank account). Klassen har følgende attributter, constructor og metoder:
| Navn | Type | Funktion |
|---|---|---|
| ACN (Accumulated count?) | static int | Tæller til at danne unikke konto numre |
| NUM (Number?) | string | Kontonummer |
| Ow (Owner?) | string | Konto ejers navn |
| _at (All transactions?) | List | |
| List med alle kontoens transaktioner | ||
| bal (Balance?) | deciaml | Kontoens tilgængelige beløb |
| BA (Bank Account?) | Constructor | Opretter en ny konto, ligger en til ACN, indsætter startbeløb på kontoen |
| Md (Make deposit?) | Metode | Opretter og indsætter en ny positiv transaction til "_at" listen |
| Mw (Make withdrawal?) | Metode | Opretter og indsætter en ny negativ transaction til "_at" listen |
| Gac (Get account?) | Metode | Opretter en rapport over alle transaktioner som string og retunerer denne |
"_at" er altså en liste af "Tr" objekter. Kigger man i Tr.cs består den af følgende attributter og constructor:
| Navn | Type | Funktion |
|---|---|---|
| Am (Amount?) | decimal | Beløbet som transaktionen indsætter (positivt) eller hæver (negativ) |
| D (Date?) | DateTime | Dato og tidspunkt for transaktionen |
| N (Note?) | string | Note til transaktionen |
| Tr (Transaction?) | Constructor | Opretter en ny transaktion med de givne parametre for Am, D og N |
3. Vurder, om koden er sikker – og begrund jeres vurdering.
Hvis vi starter med at kigge på "Tr" klassen, så er denne ikke helt sikker da "N" (Note) ikke valideres. Der kan altså skrives hvad som helst i denne attribut som f.eks. html eller javascript som så senere kunne blive udnyttes hvis det vises i en webbrowser.
Kigger vi på "Ba" klassen, så er der her samme problem med "Ow" (Owner) som heller ikke valideres og altså også kan indeholde f.eks. ondsindet javascript eller lignende. For disse to første problemer gælder det at der bør være domæne regler der bestemmer at de to f.eks. kun må bestå af bogstaver, for på den måde at undgå kode som kan ekskveres senere (kræver måske også tjek for om input er encoded?). Man kan faktisk også se at der indsættes Javascript som "Ow" i program.cs på linje 3.
"Never use generic types (String, int, etc.) for domain concepts. A Username is not a String — it's a strict type with invariants (character set, length bounds) enforced at construction time."
Videre i "Ba" klassen ser jeg endnu et problem, nemlig at man selv kan bestemme datoen for "Md" (Make deposit) og "Mw" (Make withdrawal). Dermed kan man altså indsætte og hæve i fortiden eller endda i fremtiden. Her burde man blot bruge datetime.now da det skal logges når transaktionen rent faktisk foretages (Medmindre det selvfølgelig er meningen med domænet).
3. Problemer og løsninger
Jeg løb ikke ind i problemer under denne øvelse.
4. Opsummering af erfaringer
Jeg har opnået erfaring med at gennemse kode og spotte sårbarheder ud fra Secure By Design principper.