Utilizzo di OpenSSL come libreria rispetto all'output di chiamata da comando standalone in un programma in fase di scrittura

5

In un'altra domanda su come usa OpenSSL a livello di codice mentre un membro della comunità stava scrivendo, un suggerimento era di usare il comando system() mentre un altro era includere le intestazioni C e lavorare con la libreria usando direttamente le funzioni. Inoltre, se si utilizza system() c'è un vantaggio di sicurezza nell'usare popen() o un'altra funzione invece?

Quali sarebbero le implicazioni sulla sicurezza dell'esecuzione di OpenSSL come libreria piuttosto che chiamare un eseguibile compilato dal sistema? Immagino che potrebbero esserci problemi di integrità e autenticità affidandosi a openssl installato su un sistema in alcuni casi, ma è anche possibile che un'applicazione possa utilizzare una libreria obsoleta. Ci sono alcune considerazioni per questo scenario, o questa può essere una risposta più generale (Se è così, non esitate a modificare la domanda).

    
posta Eric G 10.04.2013 - 01:37
fonte

1 risposta

5

Come sommario, OpenSSL è stato progettato come libreria e doveva essere usato come tale. L'utilità della riga di comando era, inizialmente, uno strumento per il test e per le attività manuali. Potenziali problemi con il richiamo dell'utilità da riga di comando da un'applicazione C, con system() o popen() , includono i seguenti:

  • Lo strumento si aspetta i suoi input come file, che devono essere prodotti e gestiti. Alcuni di essi sono sensibili, ad es. file che contengono chiavi private; devi fare molta attenzione quando li copi.

  • Lo strumento produce i suoi output come file o testo sul suo output standard; il testo è pensato per il consumo umano, non per l'analisi automatica. Un numero di casi d'angolo può essere problematico (ad esempio se si utilizza openssl come metodo per analizzare il contenuto dei certificati X.509, cosa succede se una stringa all'interno del certificato contiene un carattere di nuova riga?). Il formato dell'output di testo potrebbe variare con i dettagli della configurazione del sistema (ad esempio linguaggio o codifica a livello di sistema).

  • La segnalazione degli errori sarà difficile. Con l'API C, puoi sapere esattamente quale fase è fallita e perché; con lo strumento da riga di comando, otterrai, nel migliore dei casi, uno stato sintetico di errore ("qualcosa non riuscito") e un messaggio di testo.

  • system() e suo fratello popen() sono un preciso no-go nelle setuid applicazioni (che è il re dei buchi "get root shell" degli anni '80).

Per riassumere , chiamare openssl (l'utilità della riga di comando) dal codice C è macchinoso, inefficiente e complesso. La complessità da sola implica quasi meccanicamente problemi di sicurezza.

    
risposta data 10.04.2013 - 02:51
fonte

Leggi altre domande sui tag