Skip to content

Ø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.