Gå til hovedindhold
Version2 it for professionelle
Forsiden

Hovedmenu

  • It-nyheder
  • Blogs
  • It-job
  • It-firmaer
  • Whitepapers
  • Opret bruger
  • Log ind
Du kan logge ind med din e-mail-adresse
Der er forskel på store og små bogstaver i adgangskoden.
Glemt adgangskode?
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
SAP Business Warehouse Seniorkonsulent / Arkitekt
Udgivet 26. okt 2011 15.05
Business Warehouse udvikler - Aalborg/Aarhus
Udgivet 1. mar 9.06
SD Senior-konsulent
Udgivet 24. apr 10.40
SAP Supply Chain Management Senior konsulent
Udgivet 13. okt 2011 13.40

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

NemID sender Mac-computere fra 2009 ud i kulden

Udgivet 21. maj 10.42Opdateret 21. maj 10.59

It-konsulent hjalp ven med virus-problemer - og havnede i retten

Udgivet 21. maj 10.11Opdateret 21. maj 10.29

Microsoft lancerer socialt netværk - nu med videofester

Udgivet 21. maj 9.27Opdateret 21. maj 9.36

Vestager: Drop CPR - brug NemID til at verificere danskerne på nettet

Udgivet 21. maj 8.04Opdateret 21. maj 8.04

Fed business case: Giv alle dine medarbejdere iPhones

Udgivet 21. maj 6.59Opdateret 21. maj 10.39

Flere it-nyheder »

Tilmeld dig Version2's it-nyhedsbrev og vind den nye iPad.

Whitepapers

Kick-start your master data management initiative

Affecto Denmark

Affecto Data Quality Assessment: Er din indsigt og beslutning baseret på validt data?

Affecto Denmark

Framework til datamigrering i SAP miljøer - spar op til 50% på dine Data Migration udgifter

Affecto Denmark

Få et Data Warehouse (DW) review hos Affecto

Affecto Denmark

Ressourcehåndtering

Projectplace
  • Flere whitepapers

Branchenyheder

Projectplace opnår ISO sikkerhedscertificering

Projectplace

Komplex it er blevet Brocade Premier Partner

Komplex IT

Øg din effektivitet og produktivitet med bizhub C654/C754

Konica Minolta Business Solutions Denmark

Brugerfjendtlige it-løsninger gør brugerne til en sikkerhedstrussel

Projectplace

Athena IT-Group A/S med solid indtjening

Athena IT-Group

Seneste debat

  1. Vestager: Drop CPR - brug NemID til at verificere danskerne på nettet

    5 comments.
    Last update 8 sekunder
    Skrevet af Torben Mogensen
  2. Fed business case: Giv alle dine medarbejdere iPhones

    12 comments.
    Last update 3 minutter 8 sekunder
    Skrevet af Morten Espensen
  3. Cisco kan være en dyr netværksreligion

    1 comment.
    Last update 6 minutter 57 sekunder
    Skrevet af Jens Jönsson
  4. NemID sender Mac-computere fra 2009 ud i kulden

    1 comment.
    Last update 10 minutter 16 sekunder
    Skrevet af Christian Schmidt
  5. Dart: Dynamisk Statisk Programmering

    1 comment.
    Last update 29 minutter 42 sekunder
    Skrevet af Kræn Hansen
  6. To psykologiske årsager til at IT-projekter går galt

    1 comment.
    Last update 42 minutter 4 sekunder
    Skrevet af Torben Mogensen
  7. Diablo III overtrumfer Yousees planer om kabelarbejde

    16 comments.
    Last update 56 minutter 58 sekunder
    Skrevet af Peter Binderup
  8. Nets vil flytte NemID-drift til udlandet

    11 comments.
    Last update 1 time 32 minutter
    Skrevet af Rene Lauridsen

Mere debat »

It-virksomheder

Netcompany
|
MOC
|
Avenida
|
Omada
|
Platon
|
Brugertest.nu
|
Pekke
|
Devoteam
|
Visma
|
Presswire
|
Deltek Danmark
|
BEC
 

Information

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

Aktuelle emner

  • Agil udvikling
  • Android
  • Bruttolønsordning
  • Business Intelligence
  • Cloud computing
  • Download Windows 8
  • HTML5
  • Harddisk-priser
  • IE9
  • Intranet
  • It-sikkerhed
  • Kindle Fire
  • Multimedieskat
  • NemID
  • OS X Mountain 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
Tilmeld dig Version2's it-nyhedsbrev og vind den nye iPad.

Version2 udgives af

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