mboost-dp1

SXC - clix

De 25 værste programmeringsfejl

- Via BBC News - , redigeret af Pernicious

Amerikanske National Security Agency (NSA) har været med til at samle en liste med 25 “programmeringsfejl” eller sårbarheder, som kan føre til sikkerhedshuller, der kan udnyttes af kriminelle.

Idéen bag listen er, at den skal bruges som en tjeckliste til uerfarne programmører, så de kan se, hvad de skal undgå, inden færdige produkter når forbrugerne. Yderligere kan listen bruges til at fjerne sårbarhederne i eksisterende produkter.

Andre bidragsydere til listen består blandt andet af Microsoft og Symantec, der sammen med en række andre organisationer hjælper til med at sprede budskabet om listen.

Det er vigtigt for NSA og de mange virksomheder og organisationer at skabe opmærksomhed om fejlene. Som et eksempel peger NSA på, at blot to af fejlene på listen førte til 1,5 millioner registrerede sikkerhedsbrud i 2008.

Patrick Lincoln, leder af Computer Science Laboratory ved SRI International, siger, at hvis de 25 huller kunne undgås, så vil størsteparten af de kriminelle blive afskrækket, men påpeger samtidigt, at det ikke er en garanti for sikkerhed.

Peter Lincoln skrev:
The real dedicated serial attacker will probably find a way in even if all these errors were removed. But a high school hacker with malicious intent – ankle-biters if you will – would be deterred from breaking in.

Følg linket til kilden for at se listen over de 25 fejl.





Gå til bund
Gravatar #1 - spectual
13. jan. 2009 14:56
Listen er til uerfarne programmører men kræver erfaring for at forstå...
Gravatar #2 - bornakke
13. jan. 2009 15:01
Forstår ikke et klap af det meste af listen...Og jeg som gik og opfattede mig selv som en erfaren programmøer... ;(
Gravatar #3 - David Munch
13. jan. 2009 15:04
Og uden at have programmør viden, så fatter min klipfisk.. O_o
Gravatar #4 - Regus
13. jan. 2009 15:12
Håber der er en mere detaljeret forklaring et eller andet sted... halvdelen er så vagt formuleret at det gør helt ondt, og den anden halvdel er det rene nonsens
Gravatar #5 - Windcape
13. jan. 2009 15:14
huh? Det ser da helt fint ud

- "Improper Input Validation"
- "Failure to Preserve SQL Query Structure"
- "Cleartext Transmission of Sensitive Information"
- "Cross-Site Request Forgery"
- "Error Message Information Leak" - Adgangskoder i fejlkoder
- "Failure to Constrain Operations within the Bounds of a Memory Buffer"
- "Execution with Unnecessary Privileges"

Samt mange andre... De er utrolig nemme at forstå.
Gravatar #6 - farmerhe
13. jan. 2009 15:15
Alle de punkter der er nævnt har et nr. f.eks. CWE-426:Untrusted Search Path med en hurtig google søgning giver det http://cwe.mitre.org/data/definitions/426.html der er en uddybet forklaring af det.
Gravatar #7 - LordMike
13. jan. 2009 15:17
Mht. dem der ikke forstår det, kan det skyldes at listen er i bunden ?... Dvs, ikke i toppen som primært indhold, hvor man forventer den, men mere som bilag.
Gravatar #8 - Windcape
13. jan. 2009 15:18
F.eks. denne her "CWE-327:Use of a Broken or Risky Cryptographic Algorithm"

Der siges såmend bare at du ikke skal stole på md5 som kryptering, da den er for nemt at bryde, både med rainbow tables, og med brute-force.

LordMike (7) skrev:
Mht. dem der ikke forstår det, kan det skyldes at listen er i bunden ?... Dvs, ikke i toppen som primært indhold, hvor man forventer den, men mere som bilag.
Folk læser vel forhåbenlig hele artiklen? Eller i det mindste, scroller det hele igennem.
Gravatar #9 - The_Real
13. jan. 2009 15:18
"CWE-209:Error Message Information Leak" - umiddelbart vil jeg tror det er en fejl mange laver, da man oftest ønsker detaljerede fejl beskrivelser under udvikling/fejlsøgning.
Gravatar #10 - bjerh
13. jan. 2009 15:23
#8.. ved du tilfældigvis hvad man skal sætte sin lid på istedet for md5?
Gravatar #11 - nielsbrinch
13. jan. 2009 15:30
#10 SHA256 har en god balance i udbredthed og sikkerhed - men der er med garanti et par kloge hoveder herinde der har nogle dybt teoretiske grunde til at det heller ikke er godt nok.
Gravatar #12 - gnаrfsan
13. jan. 2009 15:46
#2-#5: Og relevant nok mangler der en med fejlbeskrevne kommunikationsprotokoller. Dem ser jeg en del af.
F.eks. den liste her :)
Gravatar #13 - fastwrite1
13. jan. 2009 16:03
Tænk at være den programmør som "opfandt" disse sikkerhedsfejl.

sidder der i sit værelse og hamrer løs på sit tastatur for at programmere god kode, ifølge ham, og senere opdager at hans kode er blandt de 25 absolut værste.

Så er det man tænker om det nu også var en god ide at drikke de 4 liter Cola på 1 time.
Gravatar #14 - snakefoot
13. jan. 2009 16:31
#13 Jeg tror netop ikke at der kun er een opfinder af disse fejl. Det er rimelig gennemgående at mange programmører elsker selv at opfinde den dybe tallerken (De andres er sværre at forstå eller bare ikke "født her"). Listen af top-fejl er bare en angivelse af faldgrupper som rigtig mange programmører falder i, når de skal opfinde deres nye tallerken.
Gravatar #15 - sonicwave
13. jan. 2009 16:31
Hvis man gerne vil se praktiske eksempler på fejlene, så kan www.thedailywtf.com anbefales...;)

Her er et fint eksempel på den sidste, "CWE-602:Client-Side Enforcement of Server-Side Security":
http://thedailywtf.com/Articles/Security_101__0x2e...
Gravatar #16 - White
13. jan. 2009 16:55
#9 Ja og i en release version af sit program sørger man for at denne detaljerede information ikke undslipper programmet og når brugeren. Det er jo et lille indblik i kildekoden, mere skal der ikke til hvis man er uheldig.
Gravatar #17 - jAST
13. jan. 2009 16:56
Tjah, hvis de har 25 fejl har de sikkert også flere, hvorfor fanden offentliggør de så ikke de værste 50, eller 100 ? -- Altså hvis deres mål reelt er at forbedre kvaliteten ser jeg ikke grund til at de udelader en masse andre relevante fejl.
Gravatar #18 - ksb
13. jan. 2009 17:30
#17 Denne liste er ment til at være praktisk anvendelig. Og som sådan skal man jo vælge en balance mellem at offentliggøre nok fejl til at du ender med et relativt sikkert program, og ikke at offentliggøre en alt for lang liste som ender med at virke uoverskuelig(og derfor ikke taget alvorligt ved faktisk udvikling).
Hvis du sidder i et større projekt med mange mb kode, er der langt større chance for at firmaet bag vil bruge ressourcer på at checke for 25 fejl, modsat fx 100 eller 200 fejl. Specielt dem der kræver manuel testing.

Syntes at det er god liste, der er abstrakt nok til at ramme stort set alle og alligevel specifik nok til at man meget præcist kan finde de dele af ens egen kode hvor i fejlen evt kunne være(hvis den er der).
Gravatar #19 - ricehigh
13. jan. 2009 17:38
#10 og #11
Jeg havde nok valgt at bruge en SHA hash (her tænker jeg mest på SHA-128, SHA-256 eller SHA-512) inklusiv SALT.
SALTs har den glimrende fordel at de gør rainbow table attacks ubrugelige, selv hvis en potentiel hacker får fat i din SALT, hvilket i øvrigt også er utænkeligt.

Men det er vigtigt at bemærke at ALLE hash kan brydes med brute force. Spørgsmålet er bare hvor længe dette tager, og hvor let det er for en hacker at gennemskue hvordan hashen skal brute forces.
Gravatar #20 - iphase
13. jan. 2009 18:02
Jeg har ikke programmeret i 6 år, og dengang var det simple websites.
Kan ikke forstå hvorfor den liste skulle være så svær at forstå...
Og det er da slet ikke nyt, og meget af det burde være ren logik, især CWE-602!

Syntes det er et godt initiativ, at det bliver mere udbredt viden, og føler man ikke man forstår det, så syntes jeg personligt at man burde tage udfordringen op, og lære det, for derved at blive en bedre programmør.



Gravatar #21 - arne_v
13. jan. 2009 18:05
#8

MD5 er absolut ikke nem at bruteforce. 100 millioner checks per sekund og 1 milliard computere => 100000 milliarder år.

Og p.g.a. det store udfaldsrum kan man ikke lave komplette rainbow tables. Dictionary attacks er selvfølgelig mulige.

Problemet med MD5 er, at der er fundet alvorlige kryptografiske svagheder i den, som gør det meget nemt at generere kollisioner.
Gravatar #22 - arne_v
13. jan. 2009 18:07
#9 & #16

Fuld stacktrace ses ofte for web sites i produktion.

Det er snarere reglen end undtagelsen for ASP.NET sites.
Gravatar #23 - arne_v
13. jan. 2009 18:08
#10

MD5 er stendød.

SHA1 ventes at dø i løbet af 1-3 år.

SHA256 ventes at have en levetid >20 år.

SHA256 er et fornuftigt valg idag.
Gravatar #24 - arne_v
13. jan. 2009 18:10
#19

Hvad pokker er SHA-128 ???

Der er SHA-1 som er 160 bit, SHA-224, SHA-256, SHA-384 og SHA-512.
Gravatar #25 - arne_v
13. jan. 2009 18:12
#19

Normalt vil salt også være kompromiteret, når de hashede værdier er det.

Det er vigtigere at bruge forskellige random salts end at hemmeligholde salt.
Gravatar #26 - arne_v
13. jan. 2009 18:13
#19

Og jeg vil til ehver tid anbefale en kendt hash algoritme som også crackeren kender fremfor noget hjemmestrikkert som man håber at crackeren ikke kender.
Gravatar #27 - kurtadam
13. jan. 2009 18:41
Jeg synes måske at overskriften er lidt misvisende. Det er jo en liste over programmeringsfejl med hensyn til sikkerhed og ikke generelt.
Jeg kunne godt forestille mig andre typer fejl i f.eks. raketystemer, hospitalssystemer mv., der ville være langt værre.
Gravatar #28 - arne_v
13. jan. 2009 18:49
#20

Problemet er ikke så meget viden om fejl typerne. Jeg vil gætte på at i 80% af tilfældene med fejl så kender udviklerne godt den generelle fejl.

Problemet er at sikre sig at der aldrig (eller næsten aldrig) smutter nogle af fejlene igennem.

Det er den reelle problem stilling. Og den er deværre langt vanskeligere at løse.
Gravatar #29 - doctorx
13. jan. 2009 19:06
Et godt link er http://www.sans.org/top25errors/#s4. Her kan man se beskrivelser af alle fejlene på en gang.
Gravatar #30 - ricehigh
13. jan. 2009 20:06
#24
Du har ret - der var jeg en smule for hurtig ved tastaturet;D

#25
Der ville jeg nok typisk bruge både en random salt og en hemmeligholdt salt af grundlæggende tre årsager:
1) Det er højst usandsynligt at en potentiel hacker får fat i både databasen og source filen hvor den hemmeligholdte salt opbevares.
2) Det tager længere tid at brute force, selv hvis en hacker finder frem til den hemmeligholdte salt.
3) Og bruger random salts til at sikre at to ens passwords vil fremstå meget forskelligt i databasen, hvilket sikrer at en potentiel hacker ikke kan lave fælles brute force for flere brugere af gangen.

#26
Jeg er fuldkommen enig!
Gravatar #31 - RAJensen
13. jan. 2009 20:29
Der er er nogen dage, hvor jeg er rigtig glad for, at jeg "bare" er en almindelig, "dum" computer bruger!
I dag Fx. :-D
Gravatar #32 - Windcape
13. jan. 2009 21:41
arne_v (21) skrev:
#8
MD5 er absolut ikke nem at bruteforce. 100 millioner checks per sekund og 1 milliard computere => 100000 milliarder år.
Med bruteforce mente jeg også det at udnytte hash collisions.

Det umidbare formål er jo præcist det samme, som jeg har forstået det.
Gravatar #33 - SmackedFly
13. jan. 2009 21:46
#26

SHA hash er noget af det mest brugte, så jeg går ikke udfra det er det du mener.

Tror ikke der er mange programmeringssprog tilbage der har md5 funktioner men ikke tilsvarende SHA256/SHA512 funktioner.
Gravatar #34 - hmeco
13. jan. 2009 22:21
hvor er windows vista på henne liste?

- meco
Gravatar #35 - arne_v
13. jan. 2009 23:13
#33

SHA er en af de kendte med kendte egenskaber (som så fra 256 og op er gode egenskaber).
Gravatar #36 - arne_v
13. jan. 2009 23:16
#32

Alle algoritmer kan brute forces.

En god algoritme er en algoritme hvor brute force er bedste attack.

For MD5 er der fundet bedre attacks end brute force.
Gravatar #37 - gnаrfsan
13. jan. 2009 23:22
arne_v (22) skrev:
#9 & #16

Fuld stacktrace ses ofte for web sites i produktion.

Det er snarere reglen end undtagelsen for ASP.NET sites.


Men den største fare ligger i stacktraces, er også indeholder dele af kildekoden, hvilke ikke forekommer hvis man sørger for at publicere til release.
Gravatar #38 - Fubu82
14. jan. 2009 01:21
Jeg synes #27 har en vigtig pointe. Mener at huske nogle ulykker med diverse raketter hvor fejlagtig konvertering mellem variable eller en 32 bit integer der pludselig fik en vaerdi paa mere en 32 bit gav nogle uheldige ulykker.

Fx.: http://en.wikipedia.org/wiki/Ariane_5_Flight_501

Var der ikke ogsaa noget med Excel der havde en mystisk fejl, hvilket gjorde at et stoerre selskab pludselig havde en enorm tilsyneladende regnefejl i deres budgetter.

Eller den gode gammeldags buffer overflow fejl, et evigt loop der laegger et system ned, index out of range, etc. etc.

Anyway, jeg vil sku noedigt have en Ariana raket i hovedet fordi en uheldig/dum programmoer begaar en basal fejl, der desvaerre foerst opdages runtime under et helt saerligt scenarie.
Gravatar #39 - crashoverride
14. jan. 2009 07:16
Windcape (5) skrev:
huh? Det ser da helt fint ud

- "Improper Input Validation"
- "Failure to Preserve SQL Query Structure"
- "Cleartext Transmission of Sensitive Information"
- "Cross-Site Request Forgery"
- "Error Message Information Leak" - Adgangskoder i fejlkoder
- "Failure to Constrain Operations within the Bounds of a Memory Buffer"
- "Execution with Unnecessary Privileges"

Samt mange andre... De er utrolig nemme at forstå.



Nu tror jeg ikke at det er fordi man har egenskaben at læse indenad at det er det som de siger.

Men nok snare at nogle af disse fejl kan opstår når du passerer variabler mellem platforme som gør at de nogle gange kan opsnappes og der ved misbruges.

Et eks.

Du har en Sql klasse som håndtere alt Sql kommunikation.
Du har så lavet et SQL login for at give brugen mulighed af at vælge DB type uanset udgiver at Databasen IBM, Microsoft MySQL osv.

denne klasse er en af dine topklasser hvor at alt information om din SQL forbindelse står i.

Nu har du så en masse Underklasser og dialoger med klasser tilhørende disse dialoger.

Det du så gør er at dit Login Dialog vindue sender Data til SQL klassen som bruger det til at skabe forbindelse mellem dit program og selve databasen.

Din hoved dialog henter så definitionen af din SQL klassen, og bruger den videre ned gennem systemet, men da du ikke bruger indkryptering af dit password eller bruger navn, vil din SQL klasse definition sikkert ligge oppe i starten af den dedikeret hukommelse som dit programmel bruger.

Dette gør at hvis du så laver en Hook som går ind og griber fat i Windows Kernel og der efter forspørger på hvilke processer der køre vil dit program også dukke op.

Nu er det bare at scanne hukommelsen igennem for denne sql klasse, og her vil du så have Password og brugernavn.

Nu kan du så lave en orm der søger via Hooks i Kernelen efter dit program og der efter scanner den blok hukommelse som er der hvor programmet allokere Bruger navn og password.

Samme teori kan man bruge på andre programmer Bla Outlook og FTP programmer.

Er det en fejl i programmeringen ?

Man kunne lave en ny instance af klassen hvergang man havner i en anden klasse der ved få Sqlklassen til at rygge rundt i det hukommelses område tildelt dit program.

Problemet er her at det er spild af hukommelse og kan resultere i Mem leaks, plus at du resikere pga dårlig Garbage collection at password og brugernavn står der flere steder.

Eller man kunne lave en lille simplet indkryptering af sine variabler så de ikke står som klar tekst, behøver ikke at være en eller anden 512 bit kryptering, kan sagtens lave en kryptering som vil give problemer for de fleste, som sikkert ikke er på mange bit.

Det korte og lange i dette indlæg er at, PGA. dårlig superbruger politik er det tit havned hos programmøren at han hun skal komme med en løsning til problemet at Password ikke er skiftet siden ruder konge ikke engang var en erotisk tanke i sin fars underbukser.
Gravatar #40 - crashoverride
14. jan. 2009 07:34
Jeg tror ikke at stærke encrypteringer er problemet.

Eks.

Når du laver et program gør du det at hvergang du starter programmet laver du en kyptering basseret på tiden & brugeren.

Der ved skal ham som hacker sig ind via dit program eller via orm som sniffer i dit program efter password og bruger info.

Både kende programmet men samtidig vide hvem det er der logger sig ind, samtidig hvornår han logger ind.

Ergo vil man have en faktor som ændre sig hele tiden, og er forholdsvis uforudsiglig og dette vil i sig selv gøre krypteringen stærk.
Gravatar #41 - Windcape
14. jan. 2009 09:06
#39

En ideel løsning ville være ODBC, så ens application aldrig nogen sinde har hardkodet passwords.

Jeg oplevede noget lign. da jeg kodede en ftp upload til mit website. Jeg så mit password i en debug stacktrace, og gik straks i panikmode.

Fik sørget for at det blev vel beskyttet, så de ikke kunne dukke op i en stacktrace -- selvom jeg gerne så at der slet ikke KOM en public stacktrace.

Better safe than sorry.
Gravatar #42 - Modvig
14. jan. 2009 11:09
#21 Den rare milw0rm.com har ellers gang på gang afkræftet at bruteforce på nogen måde skulle være svært at bryde
Gravatar #43 - gnаrfsan
14. jan. 2009 12:15
#42: Det er altså noget sludder.
Og brute force er ikke noget du bryder, men en fremgangsmåde.

Det svarer til at du vil bestille en pizza, uden at kende nummeret. For at finde det rigtige nummer, starter du med 00000001, så 00000002, indtil du rammer det rigtige nummer. Men det rigtige nummer er 86123661, så du nødt til at afprøve 86123661 forskelige numre for at finde det rigtige. Du kan evt udnytte kenskab til telefonnumres opbygning for at sætte farten op, men det er stadig pæænt mange numre at afprøve.
Gravatar #44 - SmackedFly
14. jan. 2009 12:33
#43

Det er et godt eksempel.

Men hvis du kender telefonnummer opbygning, f.eks. ved hvad der er mobilnumre, så er det ikke bruteforce længere.
Gravatar #45 - gnаrfsan
14. jan. 2009 13:07
#44 Det tyggede jeg også lidt på, og nej, det vil jeg heller ikke mene. Men jeg er ikke helt sikker på at alle har samme definition af brute force i hovedet.
Gravatar #46 - arne_v
14. jan. 2009 14:01
#39

Jeg kan slet ikke se din pointe.

Det kræver fulde privs på et system at læse en anden process's memory.

Hvis man har fulde privs, så er sikkerheden allerede totalt kompromiteret.
Gravatar #47 - arne_v
14. jan. 2009 14:03
#40

En stærk krypterings algoritme bygger kun på hemmeligholdelse af key ikke på hemmeligholdelse af algoritme.

Tid og brugernavn er jammerligt ringe keys. De kan brute forces i løbet af ingen tid.
Gravatar #48 - arne_v
14. jan. 2009 14:06
#41

ODBC garanterer ikke imod hardcoded passwords.

Du kan have:
* password i connection string
* password gemt sammen med DSN info (registry ??)
* bruge Windows authentication

Kun det sidste undgår password.

Men ikke alle databaser understøtter det. Og ikke alle konfigurationer muliggør det.
Gravatar #49 - arne_v
14. jan. 2009 14:08
#42

????

Jeg gav jo regnstykket - du kan selv regne efter.
Gravatar #50 - Windcape
14. jan. 2009 14:42
#48

Jeg tænkte på en form for registry ja. Specielt i forhold til webløsninger vil jeg mene at det er vigtigt at passwordet er umuligt at tilgå fra public domain.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login