2012-06-25 14 views
12

Per la certificazione 8 applicazione di Windows, ci sono (tra gli altri) i seguenti requisiti:Abilita sicurezza Gestione delle eccezioni in C++ Builder

  • 3,2 La tua app deve essere compilata utilizzando il flag /SafeSEH per garantire eccezioni alla movimentazione sicura
  • 3.3 la vostra applicazione deve essere compilata utilizzando il flag /NXCOMPAT per impedire l'esecuzione di dati
  • 3.4 la vostra applicazione deve essere compilata utilizzando il flag /DYNAMICBASE per ASLR (ASLR)

Non sono riuscito a scoprire come abilitare uno di questi in C++ Builder XE.

Per /NXCOMPAT e /DYNAMICBASE, si può usare editbin.exe da VS o peflags.exe da Cygwin. Anche se mi sentirei più fiducioso sui possibili effetti collaterali, se ci fosse un modo nativo per abilitarli.

In ogni caso, sono totalmente a perdita per /SafeSEH.

+2

Certamente Delphi XE2 non produce file eseguibili con [Tabelle di gestore di eccezioni di sicurezza] (http://www.jwsecure.com/2007/07/06/the-safe-exception-handler-table/). Non ho CPPBuilder per controllarlo, ma scommetterei di no. Penso che sarai sfortunato e dovresti inviare una richiesta di QC. In realtà potrebbe essere che i gestori di eccezioni strutturati siano sicuri, ma non è molto utile per te se i file PE non sono marcati per dirlo. Le tue app a 64 bit andranno bene, ma non è ancora possibile in CPPBuilder. –

+0

Rapporto QC pertinente: http://qc.embarcadero.com/wc/qcmain.aspx?d=106781 –

risposta

4

Primo,/SafeSEH si applica solo a x86, non x64 o ARM. Richiede che il compilatore generi tabelle aggiuntive indicando gli indirizzi di funzione che sono considerati gestori di eccezioni validi per ragioni di sicurezza. C'è una minima possibilità che tu possa farlo da solo, ma è necessario che tu guardi la catena di gestione delle eccezioni fs:0 nel codice assembly compilato e enumeri tutti gli indirizzi che sono mai stati inseriti in tale catena, quindi li descriva come documentato qui: http://msdn.microsoft.com/en-us/library/9a89h429(v=VS.80).aspx. C'è una (sottile) possibilità che il tuo codice non abbia effettivamente alcun gestore, e sono tutti nel runtime del C++ Builder (potrebbe renderlo facile se il runtime è una DLL separata).

Si dovrebbe provare a convincere C++ Builder ad aggiornare il proprio compilatore per supportare SafeSEH. È presente sulla piattaforma Windows da XP SP2, e colma una falla di sicurezza piuttosto brutta (gli indirizzi di gestori di eccezioni esistono nello stack in x86, in attesa di un buffer overflow per inserire qualsiasi indirizzo casuale da eseguire)

1

Per la questione relativa a /NXCOMPAT e /DYNAMICBASE, ho creato una richiesta per il linker C++ Builder per sostenere queste bandiere qui: https://quality.embarcadero.com/browse/RSP-13072

Utilizzando editbin.exe da Visual C++ non è certo una soluzione ideale, e la loro linker deve sostenere queste bandiere in modo nativo.

UPDATE: una richiesta supplementare è stato creato qui per i file di runtime Builder/Delphi C++ (DLL/bPLS) da distribuire con queste bandiere già fissate, in modo da evitare di dover utilizzare EDITBIN da Visual C++ per impostare da soli: https://quality.embarcadero.com/browse/RSP-13231