Ho visto in un commento che l'utilizzo di __func__
è un rischio per la sicurezza. Devo capire come va il caso?In che modo l'identificatore __func__ è un rischio per la sicurezza?
risposta
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.
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.
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.
__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 dichiarazionestatico 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
Non sei sicuro di come questo risponda alla domanda, che riguarda specificamente i rischi _security_ e non l'operazione/implementazione generale di '__func__'. –
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
dove l'hai visto? – 0x90
Risposta breve: qualcuno ha scritto qualcosa di stupido in un commento. Succede al meglio di noi. – Jens