2012-10-14 10 views

risposta

4

L'utilizzo di __func__ rivela il nome della funzione nel file binario, che facilita il lavoro di un utente malintenzionato che ha accesso al file binario.

+0

Ma cosa significa conoscere il nome di una funzione? In che modo aiuta un aggressore se conosce il nome di una funzione? – dreamlax

+1

se il nome della funzione è sha256, aes_decrypt o get_secret_key, presumo che potrebbe aiutarlo. – MByD

+1

'__func__' non è una * macro *. –

0

Rende più semplice il reverse engineering. Quindi, se vuoi mantenere il modo in cui la tua applicazione funziona in modo segreto, rende più facile la vita di un utente malintenzionato.

Questo è rilevante per le funzionalità DRM o se si desidera rendere più difficile l'imitazione degli algoritmi nelle applicazioni concorrenti.

Ma ciò non influisce sulla sicurezza, in quanto un'applicazione in cui l'inversione mostra le vulnerabilità era insicura in primo luogo.

0

Se la sicurezza dell'applicazione si basa sul fatto che i suoi nomi delle funzioni rimangono segreti, è un rischio per la sicurezza utilizzare __func__, poiché il compilatore dovrà memorizzare il nome della funzione da qualche parte nel binario compilato.

0

__func__ è l'identificatore predefinito standard C99 che si espande in una variabile di matrice di caratteri contenente il nome della funzione quando viene utilizzata all'interno di una funzione. Da C99 6.4.2.2/1 descrive:

L'identificatore __func__ è implicitamente dichiarata dal traduttore come se, subito dopo la parentesi di ogni definizione di funzione apertura, la dichiarazione

statico const char __func__ [ ] = "nome-funzione"; è apparso, dove nome-funzione è il nome della funzione di inclusione lessicale. Questo nome è il nome disadorno della funzione.

Si noti che non è una macro e non ha alcun significato speciale durante la preelaborazione.

un'occhiata a questo link per maggiori informazioni sulla __func__ a:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1642.html

Se la soluzione si basa sull'espansione coinvolto nel predefinito costante __func__ sensibile al contesto, non può essere implementato in una funzione in modo sicuro e fornire la stessa convenienza.

__func__ viene espanso testualmente al momento della sua invocazione, quindi, potrebbe facilmente influire sul flusso di controllo del codice di richiamo valutando le istruzioni break, continue o return o non riuscendo a terminare correttamente le istruzioni. Gli effetti di invocarlo possono essere sorprendenti e portare a sottili difetti.

Preferiscono funzioni statiche o in linea a macro funzioni o __func__.

Tuttavia, nei casi in cui la definizione di __func__ è inevitabile, la definizione deve evitare istruzioni che modificano il flusso di controllo del codice di richiamo. Idealmente, dovrebbe essere un'espressione singola.

idea più e codici di esempio:
https://www.securecoding.cert.org/confluence/display/seccode/PRE13-C.+Avoid+changing+control+flow+in+macro+definitions

+2

Non sei sicuro di come questo risponda alla domanda, che riguarda specificamente i rischi _security_ e non l'operazione/implementazione generale di '__func__'. –

+0

Ho provato a rendere l'uso di '__func__' più comprensibile e il fatto che non sia una' macro' come OP dice nella domanda. "Gli effetti di invocarlo possono essere sorprendenti e portare a sottili difetti". e i collegamenti dati nella risposta puntano molto bene su come può causare altri moduli dipendenti a comportarsi in modo imprevedibile e quindi meno sicuro. – askmish

Problemi correlati