2013-05-07 2 views
11

Voglio scrivere una libreria che sia dinamicamente caricabile e chiamabile dal codice C, ma in realtà non voglio scriverlo in C: il codice è critico per la sicurezza, quindi voglio un linguaggio che renda più facile avere fiducia che il mio codice è corretto Quali sono le mie opzioni?In quali lingue oltre a C posso scrivere una libreria C?

Per essere più specifici, voglio che i programmatori C siano in grado di eseguire #include e -l e iniziare a utilizzare la mia libreria come se avessi scritto in C. Vorrei distribuire un Mi piacerebbe programmatori in altre lingue per poter utilizzare i loro strumenti preferiti per il collegamento alle librerie C per collegarsi ad esso. Idealmente mi piacerebbe che fosse possibile su ogni piattaforma che supporta C, ma mi accontento di Linux, Windows e MacOS.

+2

Questo è piuttosto meno vero per la sicurezza che per altre preoccupazioni. –

risposta

0

C'è finalmente una risposta decente a questa domanda: Rust.

4

Tutto ciò che viene compilato nel codice nativo. Quindi potresti Google per questo - "lingue che si compilano in codice nativo". Vedi, ad esempio, Programming languages that compile to native code and have the batteries included

C++ è spesso la scelta per questo. Compilare codice nativo e fornito di mantenere le interfacce semplici, facile da scrivere un livello adattatore.

Anche l'obiettivo C e Fortran sono possibili.

+2

In realtà potrebbe usare molte più lingue se lo desidera, ad esempio usando l'API C di Python come wrapper (e includendo le librerie necessarie all'interno del suo), potrebbe usare Python. – Dave

+5

Non penso che C++ sia una buona scelta per una libreria C. Affatto. –

+0

@VladLazarenko cura di giustificare? – djechlin

1

È possibile scriverlo in lua - fornire una API C a una libreria Lua è relativamente semplice. C++ è anche un'opzione, anche se ovviamente dovresti scrivere i wrapper C e assicurarti che nessuna eccezione possa sfuggire alle tue funzioni. Ma onestamente, se è fondamentale per la sicurezza, i piccoli inconvenienti del linguaggio C non dovrebbero essere un grosso problema. Quello che dovresti fare è dimostrare la correttezza del tuo programma dove è fattibile e testare ampiamente dove non lo è.

0

È possibile scrivere una libreria in Java. JNI viene normalmente utilizzato per chiamare C da Java, ma può essere utilizzato al contrario.

2

Quasi tutte le applicazioni critiche per la sicurezza che conosco sono scritte in C. Non credo che ci siano altri linguaggi che hanno uno stato reale più elevato nella produzione di applicazioni sicure.

C si dice che sia un linguaggio povero per la sicurezza da parte di persone che non capiscono.

Se si desidera che i programmatori C utilizzino la libreria, utilizzare C. Se qualcos'altro sta legando una mano dietro la schiena mentre si prova a camminare su un bilanciere (l'attrezzatura per la ginnastica). Certo, ci sono dozzine di altri linguaggi che sono in grado di interfacciarsi con C, ma in genere implica l'uso di un livello C e quindi l'inserimento dei tipi di dati C in un tipo di dati specifico della lingua (oggetti Java, oggetti Python, ecc.) E quando la chiamata è finita, si utilizza la stessa conversione su un tipo di dati C. Rende solo più difficile lavorare e potenzialmente più lento se non si prendono tutte le decisioni di progettazione giuste. E la gente non capirà il codice sorgente, quindi non gli piacerà usarlo (vedi di più su questo sotto).

Se si vuole la sicurezza, quindi scrivere molto buon codice, indossando il cappello "aspetti di sicurezza" saldamente in ogni momento, trovare una mailing di sicurezza list o al sito web e post-it lì per la revisione, prendere i commenti di revisione a bordo, capire i commenti e correggere eventuali commenti significativi da risolvere. Distribuisci il codice sorgente agli utenti, in modo che le persone possano vedere cosa fa il tuo codice. Coloro che comprendono la sicurezza sapranno cosa cercare e capiranno di aver fatto un buon lavoro (o un cattivo lavoro, a seconda di quale sia applicabile) - e coloro che non lo faranno si fideranno delle persone giuste. Se è buono, la gente lo userà. Se è "nascosto" e non è di facile accesso, non avrai molti clienti, indipendentemente dalla lingua che utilizzi.

Non preoccuparti, non rivelerai nulla di più dalla fonte di rilascio.Se c'è un difetto nel codice ed è abbastanza popolare (o importante), qualcuno troverà il difetto, anche se pubblichi solo i binari. Per gli esperti di reverse engineering, non avere codice sorgente è solo un piccolo ostacolo.

sicurezza non deriva da utilizzando un linguaggio specifico o uno strumento specifico, esso deriva da un buon design e una buona conoscenza di base dei problemi con la sicurezza.

E ricordate security by obscurity (se questo significa "codice sorgente nascosta" o "linguaggio inusuale", o qualcosa d'altro oscuro) è falsa sicurezza.

+3

È stato dimostrato che molti dei progetti di protezione open source orientati alla sicurezza presentano i tipi di vulnerabilità derivanti dall'uso di un linguaggio non puntatore sicuro come C. Perché dovrei credere di essere un programmatore migliore di tutti loro? Se riesco a convincere il computer a fare il lavoro per assicurarmi di non aver commesso quegli errori particolari, è più probabile che faccia un lavoro approfondito. –

+1

Poiché si è a conoscenza dei problemi con l'utilizzo dei puntatori, dovrebbe essere relativamente facile sapere su quali aree concentrarsi.E le lingue quindi non usano i puntatori sono tipicamente scritte in C, il che significa che si finisce con lo stesso problema, ma ora è nascosto dalla tua vista [a meno che, naturalmente, non ci sia un "linguaggio sicuro garantito", ma finora io non ho incontrato un linguaggio che è sicuro di essere sicuro]. E naturalmente, il punto di vista del codice è che ottieni altre persone, che hanno esperienza nel trovare difetti nel codice per esaminare il codice, cercheranno un uso vulnerabile dei puntatori. –

+2

C si dice anche che sia un linguaggio povero per la sicurezza da parte di chi * fa * capisce. Prendiamo ad esempio il lavoro di Mark Miller sul linguaggio E, il lavoro di Jonathan Rees su W7 e il recente lavoro di Anil Madhavapeddy e altri su Melange. Il documento del 2007 "Melange: Towards a" funzionale "Internet" ([PDF] (http://anil.recoil.org/papers/2007-eurosys-melange.pdf)) utilizza OCaml per una combinazione di efficienza e sicurezza. Vedi la loro Tabella 1, che elenca le vulnerabilità di OpenSSH CERT attribuibili a debolezze linguistiche. –

3

Sembra che si stia cercando una lingua con la compatibilità ABI o che possa essere descritta come risultante nel codice native. Fintanto che può essere compilato su un file oggetto valido (tipicamente un file .obj o .o) accettato dal linker, dovrebbe essere il criterio principale. Inoltre, si desidera scrivere un file di intestazione come vantaggio per qualsiasi codice client scritto in C (o una lingua/variante strettamente correlata).

Come detto da altri, avete bisogno di un buon motivo per scegliere una lingua diversa C in quanto è la lingua-franco di basso livello software/sistemi. Assembler è un'opzione, sebbene più difficile da eseguire tra le piattaforme. D è un'alternativa più portatile, ma meno diffusa, progettata per produrre codice nativo sicuro ed efficiente con il minimo sforzo. Ce ne sono molti altri

2

Potreste essere interessati a ATS, http://ats-lang.sourceforge.net/. ATS compila via C, può essere efficiente come C, e può essere utilizzato in un modo che è compatibile con ABI C. Dal sito web del progetto:

ATS è un linguaggio di programmazione a tipizzazione statica che unifica implementazione con formale specifica. È dotato di un sistema di tipo altamente espressivo radicato nel framework Applied Type System, che dà il nome alla lingua. In particolare, in ATS sono disponibili sia tipi dipendenti che tipi lineari. L'attuale implementazione di ATS (ATS/Anairiats) è scritta in ATS stesso. Può essere efficiente come C/C++ (vedi Il Linguaggio benchmark del gioco per prove concrete) e supporta una varietà di programmazione paradigmi

sistema di tipo dipendente e lineare di ATS aiuta a produrre garanzie statiche circa il codice, tra cui vari aspetti della sicurezza della gestione delle risorse.

Chris Double ha scritto una serie di articoli che esplorano la potenza del sistema di tipi di ATS per la programmazione dei sistemi qui: http://bluishcoder.co.nz/tags/ats/. Di particolare nota è questo articolo: http://bluishcoder.co.nz/2012/08/30/safer-handling-of-c-memory-in-ats.html

Questo documento tratta gli aspetti di chiamare avanti e indietro tra ATS e il codice C: https://docs.google.com/document/d/1W6DYQApEqKgyBzMbvpCI87DBfLdNAQ3E60u1hUiMoU0

Lo svantaggio principale è che la programmazione dipendentemente tipizzato è ancora una prospettiva scoraggiante, anche per i non - programmazione dei sistemi. La sintassi del linguaggio è anche un po 'strano: considerare stranezze lessicali come ad esempio l'uso di [email protected] come parola chiave. Infine, ATS è in una certa misura un progetto di ricerca, e personalmente non so se sarebbe sensato adottare per uno sforzo commerciale.

2

In teoria, sarà Fortran: meno indiretta (come in: il mio array è [qui], non solo un puntatore a qui, e questo è vero per la maggior parte ma non tutte le strutture e le variabili dei dati).

Tuttavia ... ci sono molti trucchi e stranezze in Fortran: non, forse, come molti come in C, ma probabilmente sapete il modo per aggirare C, piuttosto meglio di Fortran.Qual è il punto dietro la maggior parte dei commenti che dicono 'Conosci il tuo codice' - ma tu lo davvero sai cosa sta facendo il tuo compilatore?

Conoscendoti, sono pronto a fidarmi di te, per C. La maggior parte dei programmatori no. Non sai e non puoi sapere cosa fa un compilatore JVM o JIT locale, e questo è un buco nero nel tuo modello di sicurezza se stai usando linguaggi di scripting Java o C# r.

Ignora chiunque ti dica che gli uomini-capezzoli di informatica sicura hanno il proprio assemblatore: probabilmente non conoscono nemmeno gli errori di sicurezza che stanno facendo in tutti i progetti non banali che pubblicano. Conosci il tuo compilatore, davvero.