Gå til hovedindhold
Version2 it for professionelle
Forsiden

Hovedmenu

  • It-nyheder
  • Blogs
  • It-job
  • It-firmaer
  • Emner
  • Opret bruger
  • Log ind
Se kommentarer (10)
Emner Udviklingsværktøjer, Sikkerhedshuller

Sårbarheder får Microsoft til at droppe udbredt funktionskald i C

Microsoft sender senere på året hukommelsesfunktionen memcpy() på pension. Funktionskaldet kunne udnyttes til hackerangreb.

Af Mikkel Meister Tirsdag, 19. maj 2009 - 9:43

Microsoft vil ikke længere leve med potentielle sikkerhedshuller i softwaren forårsaget af C-funktionen memcpy(). Derfor bliver funktionen føjet til listen over ?forbudte? C-funktioner senere på året, fremgår det af et indlæg på MSDN-bloggen The Security Development Lifecycle (SDL).

Funktionen memcpy() bruges til at kopiere et antal bytes mellem to ikke-overlappende områder i hukommelsen. Den er defineret i header-filen string.h i standardbiblioteket for programmeringssproget C.

Problemet med memcpy() - og flere andre funktionskald som for eksempel strcpy() og strcat() - er, at funktionerne kan give anledning til buffer overflow, hvilket kan udnyttes i hackerangreb.

Memcpy() får følgeskab af funktionerne CopyMemory() og RtlCopyMemory() og erstattes af funktionen memcpy_s(), der ikke skulle lide under samme sårbarhed.

»Fordi vi har set mange sårbarheder i sikkerheden i produkter fra Microsoft og mange andre, og fordi vi har en funktionsdygtig erstatning (memcpy_s(), red.), er jeg 'stolt' af at kunne annoncere, at vi tilsigter at tilføje memcpy() til listen senere på året,« lyder det på SDL-bloggen.

Der opfordres samtidig til, at alle udviklere sætter memcpy() stolen for døren og tilføjer følgende kode i fælles header-filer:

#pragma deprecated (memcpy, RtlCopyMemory, CopyMemory)

Programmøren vil så modtage følgende advarsel:

warning C4995: 'memcpy': name was marked as #pragma deprecated

Microsoft-udviklerne påpeger, at det er relativt smertefrit at skifte fra memcpy() til memcpy_s(). Den nye funktion tager et ekstra argument, som er størrelsen på destinationsbufferen. Dermed tvinges programmøren til at tænke over, hvor meget data skal kopieres hvorhen, hvilket skulle reducere risikoen for buffer overflows.

Blogindlægget på Security Development Lifecycle kan findes via det eksterne link herunder.

Send Tweet
Udskriv

IT-job & karriere

  • Se alle it-job
  • Importer din kompetenceprofil fra LinkedIn
Skarp C#-udvikler søges til fast stilling i spændende virksomhed i Østjylland
Udgivet 8. feb 9.17
Salesforce.com - udviklere til Vallensbæk
Udgivet 30. nov 2011 10.44
Website & Interactive Marketing Coordinator
Udgivet 8. feb 10.28
Navision Application Supporter
Udgivet 23. sep 2011 15.59

Kommentarer (10)

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Peter Valdemar Mørch 19. maj. 2009 - 10.32
 
Men memcpy fra string.h tager da allerede en size_t n parame ...

Fra "man 3 memcpy"

SYNOPSIS #include <string.h> void *memcpy(void *dest, const void *src, size_t n);

Det er den samme definition man finder i http://en.wikipedia.org/wiki/String.h hvor der står "string.h is the header in the C standard library for the C programming language"

Fra
http://msdn.microsoft.com/en-us/library/dswaw1wk(VS.80).aspx
har vi:

void *memcpy(
void *dest,
const void *src,
size_t count
);

"n" fra standarden hedder "count" i Windows, men der er stadig en størrelsesparameter med. (Hvor'n faen skulle den ellers kunne virke?)

Er der endnu en string.h og definition af memcpy under windows?

Hvordan kan dette give anledning til buffer overflow med mindre n/count er forkert?

Peter

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Rune Madsen 19. maj. 2009 - 10.44
 
Re: Men memcpy fra string.h tager da allerede en size_t n pa ...

Hej

I memcpy_s(), er der et ekstra argument:
size_t numberOfElements

Fra
http://msdn.microsoft.com/en-us/library/wes2t00f(VS.80).aspx
(links må åbenbart ikke indeholde paranteser...)

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Torben Mogensens billede
Torben Mogensen 19. maj. 2009 - 11.00
 
Det er en begyndelse...

... men C har stadig alt for mange sikkerhedshuller, der skyldes lageroperationer uden check.

C bør kun bruges til indlejret programmering, hvor programmøren skal have præcist styr på ressourceforbrug, og er villig til at være ekstra omhyggelig med sin kode for at sikre, at den ikke laver snavs. At bruge C til applikationsprogrammering (browsere, tekstbehandling, osv.) er en misforståelse. Sproget er ikke designet til det, og det ses tydeligt i dets totale uegnethed til dette formål.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Poul-Henning Kamps billede
Poul-Henning Kamp 19. maj. 2009 - 11.21
 
Problemet er ikke softwaren eller memcpy()

Problemet er at hardware folkene har fået lov til at køre løbet med at definere protection-architecture, helt uden hensyn til hvad der faktisk er brug for nu om dage.

Objecter bør være hardware-implementerede, således at den størrelse de nu en gang er givet, bliver håndhævet af hardwaren.

Ikke alene kan det lade sig gøre, det er blevet gjort:

http://en.wikipedia.org/wiki/Rekursiv

det er vejen frem, at bandlyse memcpy(3) er svarer til at beep'e grimme ord ud på TV.

Poul-Henning

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Jonas Finnemann Jensen 19. maj. 2009 - 12.38
 
Re: Men memcpy fra string.h tager da allerede en size_t n pa ...

numberOfElements: Size of the destination buffer.

Okay, så nu kommer udviklerne til at tænke over om der rent faktisk også er plads til de bytes man vil kopier i dest...
- Det er der jo ingen der har tænkt over før :)

Jeg er enig i at C ikke skal bruges til applikations udvikling... Men de steder hvor ydelse er kritisk eller man arbejde embedded, er C da et godt alternativ til assembler...

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Jens Madsen 19. maj. 2009 - 13.59
 
ADA

Kopiering af memory direkte (uden type og intervalcheck), hører ikke til i et højniveau programmeringssprog. I stedet, skal man tillade de operationer, som programmørerne rent faktisk behøver - og sikre, at de såvel type som interval tjekker. Dette tjek, må aldrig gøres af programmøren ved hjælp af "sikker kodning", men skal gøres af compiler, således funktionerne kan flyttes til hardware uproblematisk, når det kommer - og uden software skal laves om. ADA - og selv pascal - er på flere måder bedre end C, med hensyn til kopiering. I pascal, kan du kopiere hele structs (records) og arrays, med tildelingsoperatoren :=. Dette, naturligvis under forudsætning af, at typerne er ens, så det kan tvinge til en opdeling i structs/records, som tager hensyn til det der er fornuftigt at kunne kopiere. I ADA kan du også kopiere en delarray, som standard i sproget - igen tjekkes for type, dog her kun for enkeltelementer. Det er meget vigtigt, at de kopieringsmuligheder som programmøren har brug for, er del af sproget, således de senere kan implementeres i hardware, når CPU'erne og ram kredsene får indbygget kopieringsmaskine. I hardware, er muligt at indbygge "kopieringsmaskiner", der kan kopiere ekstremt hurtigt med O(log(n)) hvor n er størrelsen af data der skal kopieres.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Anders Borch 19. maj. 2009 - 15.30
 
en anden nem løsning

Hvis programmøren ikke kan finde ud af at vælge den rigtige størelse når han kalder memcpy, hvad er så chancen for at han kan finde ud af det når han kalder memcpy_s?

Hvis MS vil gøre memcpy forbudt og kun stille memcpy_s til rådighed er løsningen jo åbenlys:

#define memcpy(s1, s2, n) memcpy_s(s1, n, s2, n)

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Søren Dreijer 20. maj. 2009 - 04.54
 
Re: en anden nem løsning
Hvis programmøren ikke kan finde ud af at vælge den rigtige størelse når han kalder memcpy, hvad er så chancen for at han kan finde ud af det når han kalder memcpy_s?

Det er jo netop det, at programmøren skal specificere størrelsen af den buffer, han kopierer ind i, der gør hele forskellen. På den måde bliver han tvunget til at overveje hvor meget data der kan blive proppet ind og om der egentlig er plads til det. Under alle omstændigheder vil der aldrig blive skrevet for meget i bufferen.

Hvis MS vil gøre memcpy forbudt og kun stille memcpy_s til rådighed er løsningen jo åbenlys: #define memcpy(s1, s2, n) memcpy_s(s1, n, s2, n)

Din "løsning" er ret uhyggelig. Du siger, at destinationsbufferen altid er stor nok til at indeholde det data, der bliver kopieret (dvs. n), hvilket jo netop er det memcpy_s() forsøger at få folk til at forstå ikke passer.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Rasmus Nielsen 20. maj. 2009 - 07.52
 
Programmering er ikke idiotsikker

Selvfølgelig kan man gøre noget ved at indtænke nogle procedurer, som mindsker risikoen for fejl, men f.eks. at tvinge alle til at bruge memcpy_s i stedet for memcpy virker lidt mærkeligt.

En ting er at det ikke ville komme bag på mig hvis Anders Borchs definition ovenfor ender med at blive flittigt brugt, om ikke eksplicit, så inden i hovedet på diverse programmører.

Noget andet er at det er en styrke ved C, at det er op til programmøren at beslutte hvornår og hvor ofte parametre skal valideres. Som C-programmør ved man at de basale elementer i sproget som udgangspunkt er helt uden validering. Det må man så selv finde en strategi for. Den mest basale er at indføre en wrapper-funktion med ekstra check. memcpy_s er blot en sådan funktion.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Rasmus Nielsen 20. maj. 2009 - 08.00
 
Re: Det er en begyndelse...

At sige at C er uegnet til applikationsprogrammering er for mig at se en misforståelse, men det er rigtigt, at hvis man benytter C til applikationsprogrammering, så vil man i velskrevet kode sjældent se C funktioner benyttet direkte i applikationskoden.

Det er blot et spørgsmål om at opbygge et abstraktionslag, der understøtter det niveau man vil programmere på. Herefter programmeres applikationen uden unødvendige hensyn til resurser, der håndteres under abstraktionslaget.

I nogle tilfælde kan man finde et sprog, der allerede fra fødslen tilbyder et passende sæt abstraktioner, og så vil det være mere effektivt, men i andre tilfælde vil det være en fordel selv at kunne definere disse og at have mulighed for at gå ned i "maskinrummet" når det er nødvendigt. At C er ganske velegnet i dette tilfælde er grunden til at C er et ualmindeligt sejlivet sprog.

Med dette udgangspunkt synes jeg, at memcpy_s er overflødig som en standardfunktion i C.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer

Tilføj kommentar

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Log ind herunder eller opret en bruger for at skrive kommentarer
Du kan logge ind med din e-mail-adresse
Der er forskel på store og små bogstaver i adgangskoden.
Glemt adgangskode?

Seneste nyt

Teknologirådet reddet: Fortsætter i ændret konstruktion

Udgivet 10. feb 11.32Opdateret 10. feb 11.32

Version2 tester: Her kan du fare vild i Windows 8

Udgivet 10. feb 10.44Opdateret 10. feb 11.04

Rygte: Google snart klar med Dropbox-konkurrent

Udgivet 10. feb 10.19Opdateret 10. feb 10.19

Ny blog stiller skarpt på juraen i it-kontrakter

Udgivet 10. feb 10.00Opdateret 10. feb 10.15

Windows 8 Consumer Preview klar til download 29. februar

Udgivet 10. feb 9.49Opdateret 10. feb 10.24
Flere it-nyheder »
Få it-nyheder og blogs hver dag med Version2's nyhedsbrev.

Seneste debat

  1. XBMC på fit-PC3

    20 comments.
    Last update 1 minut 9 sekunder
    Skrevet af Peter Toft
  2. Microsoft skrotter Startknappen i Windows 8

    14 comments.
    Last update 3 minutter 11 sekunder
    Skrevet af Alex Larsen
  3. Konklusion af Polsag-review fra 2009: Elendig kode hånd i hånd med elendig kontrakt

    14 comments.
    Last update 3 minutter 20 sekunder
    Skrevet af Casper Skydt
  4. Opdateret liste over danske iværksættere

    3 comments.
    Last update 4 minutter 50 sekunder
    Skrevet af Johannes Ulfkjær Jensen
  5. 4 gode sikkerhedsråd: Sådan gør du firma-pc'en vinterferieklar

    6 comments.
    Last update 8 minutter 12 sekunder
    Skrevet af Maciej Szeliga
  6. Enhedslisten: Nødvendigt med ny it-strategi, hvis skandaler skal undgås

    11 comments.
    Last update 23 minutter 30 sekunder
    Skrevet af Martin Ipsen Pedersen
  7. Er it-skandalerne kontrakternes skyld?

    3 comments.
    Last update 29 minutter 18 sekunder
    Skrevet af Johnnie Hougaard Nielsen
  8. ACTA er i orden!

    52 comments.
    Last update 31 minutter
    Skrevet af Mads Randstoft
Mere debat »

Information

  • Kontakt redaktionen
  • Job- og annoncesalg
  • Teknisk support
  • Om Version2
  • Brugerbetingelser
  • Privatlivspolitik

Aktuelle emner

  • Agil udvikling
  • Android
  • Bruttolønsordning
  • Business Intelligence
  • Cloud computing
  • Digitaliseringsstyrelsen
  • HTML5
  • Harddisk-priser
  • IE9
  • Intranet
  • It-sikkerhed
  • Kindle Fire
  • Multimedieskat
  • NemID
  • OS X Lion
  • Open source CMS
  • Projektledelse
  • Scrum
  • Sharepoint intranet
  • Storage
  • Ubuntu 11.10
  • Virtualisering
  • Windows 8
  • Windows Phone 7
  • iOS 5
  • iPhone 4S

Tjenester

  • Android-app
  • iPhone-app
  • RSS-feeds
Følg @version2dk
Få it-nyheder og blogs hver dag med Version2's nyhedsbrev.

Version2 udgives af

  • Mediehuset Ingeniøren A/S work Skelbækgade 4 1717 København V
  • Tlf. work 33265300