Domanda

Recentemente mi sono imbattuto in un articolo che sostiene Microsoft mette al bando la funzione di memcpy() nei suoi negozi di programmazione sicura. Capisco le vulnerabilità insite nella funzione, ma è necessario vietare l'uso del tutto?

In caso di programmi Scrivo essere evitando <=> del tutto, o semplicemente assicurando che sia usato in modo sicuro? Quali alternative esistono che forniscono simile, ma più sicuro functionalilty?

È stato utile?

Soluzione

per memcpy e wmemcpy che convalidare i loro parametri.

memcpy_s dice: "Hmm, prima di leggere da questo indirizzo, mi permetta di verificare da me stesso che non è un puntatore nullo, e prima di scrivere a questo indirizzo, io ripetere quella prova avrò anche confrontare il numero. di byte mi è stato chiesto di copia fino al formato sostenuto della destinazione;. se e solo se la chiamata passa tutti questi test devo eseguire la copia "

memcpy dice: "Roba la destinazione in un registro, roba la fonte in un registro, roba il conteggio in un registro, eseguire movsb o MOVSW." (Esempio su Geocities, non molto tempo per questo mondo: http: // www. geocities.com/siliconvalley/park/3230/x86asm/asml1013.html )

Modifica: Per un esempio in natura del Il tuo desiderio è un ordine approccio alla memcpy, considerare OpenSolaris, dove memcpy è (per alcune configurazioni) definito in termini di bcopy e bcopy (per alcune configurazioni) è ...

void
     33 bcopy(from, to, count)
     34 #ifdef vax
     35     unsigned char *from, *to;
     36     int count;
     37 {
     38 
     39     asm("   movc3   12(ap),*4(ap),*8(ap)");
     40 }
     41 #else
     42 #ifdef u3b      /* movblkb only works with register args */
     43     unsigned char *from, *to;
     44     int count;
     45 {
     46     asm("   movblkb %r6, %r8, %r7");
     47 }
     48 #else
     49     unsigned char *from, *to;
     50     int count;
     51 {
     52     while ((count--) > 0)
     53         *to++ = *from++;
     54 }
     55 #endif

Edit: Grazie, Millie Smith! Ecco ciò che era sulla prima pagina GeoCities ho linkato sopra:

MOVS

Il movs istruzione viene usata per copiare stringa di origine nella destinazione (sì, la copia, non si muove). Questa istruzione ha due varianti: movsb e movsw. Il movsb ( "spostare stringa di byte") si sposta un byte alla volta, mentre movsw muove due byte alla volta.

Dato che vorremmo spostare più byte alla volta, queste istruzioni MOV sono fatto in batch utilizzando il prefisso rep. Il numero di movimenti è specificato dal registro CX. Vedere l'esempio di seguito:

:
lds   si, [src]
les   di, [dest]
cld
mov   cx, 100
rep   movsb
:

In questo esempio copierà 100 byte da src a dest. Se si sostituisce movsb con movsw, si copia 200 byte invece. Se si rimuove il prefisso rappresentante, il registro CX non avrà alcun effetto. Si sposta un byte (se è movsb, o 2 byte se è movsw).

Altri suggerimenti

Una motosega, se usato correttamente, è sicuro. Stessa cosa con memcpy (). Ma in entrambi i casi, se si colpisce un chiodo, può volare e farti del male.

In breve, memcpy () è necessario per basso livello di calcolo e non andrà via, ma per la programmazione di alto livello che non ne hanno bisogno. Non v'è alcun memcpy () in Python.

Non preoccupatevi. alternative Microsofts non sono molto meglio. Il valore principale è che questi causano il codice per diventare portabile a Linux. Microsoft sta rendendo molto più denaro per il sistema operativo che vendono ai vostri clienti di quello che stanno facendo sulla copia di Visual C ++ è stato acquistato.

L'articolo si descrive un'alternativa più sicura: memcpy_s che richiede di specificare la lunghezza massima del bersaglio. Quando tale numero viene fornito indipendente dalla quantità di byte da copiare, funge da barriera per impedire buffer overflow. Naturalmente, si può abusare che dando lo stesso numero ad entrambi.

è messa al bando memcpy () nel mio codice facendomi un programmatore migliore e la mia applicazione più sicura o solo più incompatibili? Sono incerto, se MS vuole davvero cambiare qualcosa o semplicemente fare qualsiasi nuovo codice C incompatibile con altri compilatori. Btw. MS fa questo trucco su molte funzioni ed è abbastanza fastidioso. strcpy -> strcpy_s -.> StringCchCopy

Credo che C dovrebbe lasciare la possibilità al programmatore di sparare il suo piede. gestione manuale della memoria è sicuro se fatto correttamente.

L'hai detto tu: "Microsoft sta vietando la funzione memcpy () nelle sue negozi di programmazione sicura , capisco le le vulnerabilità insite nella funzione ,"

memcpy () e una pletora di altre funzioni standard sono noti per causare le vulnerabilità, in modo da perché un negozio di programmazione sicura permettono il loro uso quando un (seppur incrementale) il miglioramento è banale?

Non c'è dubbio che nei loro sforzi per migliorare la sicurezza dei propri prodotti, le revisioni del codice chiaramente indicato che queste funzioni sono stati responsabili di una percentuale significativa di vulnerabilità, buffer overflow ecc Invece di fare wrapper per uso interno li introdotti la libreria standard e ha aggiunto un compilatore di avviso (non un divieto) a beneficio di tutti.

Se stai usando le versioni più vecchie, come il C99 o C ++ 98, o su Solaris, non è possibile utilizzare memcpy_s, se non avete la libreria C di sicurezza installato.

memcpy_s () è un'implementazione Microsoft-specifico che non esiste sul non-MS implementazioni, tra cui ANSI, prima di C11, per i propri standard.

Lascio la roba pro-MS e anti-MS a parte, perché è irrilevante.

memmove () è una soluzione migliore in ogni caso dal momento che affrontato il problema di sovrapposizione. memmove_s () è più robusto, ma ancora una volta, solo se siete in C11 o poi.

L'alternativa è quella di chiamare memcpy_s

Si suppone di utilizzare memcpy_s (), invece. Lo stesso tipo di _S versioni esistono per una varietà di altre funzioni considerate come non protetta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top