web-dev-qa-db-ja.com

Cはもはやセキュリティ関連のソフトウェアに適していますか?

Cは、特にFOSSコミュニティで非常に人気のある堅固で広く普及しているプログラミング言語です。

多くのセキュリティ関連ソフトウェア(暗号化ライブラリなど)はCで記述されており、将来もCで記述される可能性があります。その主な理由の1つは、Cプログラムの優れたパフォーマンスと移植性です。しかし、要点は、非常に経験豊富なソフトウェア開発者でさえ、バッファオーバーフローのようなバグを防ぐことができないということです。毎年、メモリ管理に関連する多くのセキュリティバグが、非常に人気のあるレビュー済みのソフトウェアにも見られます。

だからあなたへの私の質問:今日でもCでセキュリティ関連のソフトウェアを書くのは良い考えですか?それとも、Rust、Goなどの最新の言語やPythonなどのより高級な言語を選択することは、「設計によるセキュリティ」ではありませんか

33
Aliquis

LinuxエコシステムのほとんどのソフトウェアがCで書かれている主でほとんどユニークな理由はTraditionです。開発者はCで記述されたソフトウェア、CベースのAPIを備えたライブラリを目にし、Cを使用します。コンパイラはすでにそこにあり、OS全体がCで記述されているため、うまく機能します。

これは、Cが堅牢なソフトウェアの開発にgoodであることを示しているわけではありません。実際、Cはかなりひどいです。 Cでは、開発者は常に多くのことに注意しなければなりません。 Cには、次のような最小のミスで発生する多くのトラップがあります。

  • チェックされていない配列アクセス。これにより、オーバーフローが可能になります。
  • 手動メモリ管理。解放後使用または二重解放エラー、およびメモリリークを引き起こします。
  • 一見合理的な式を無意味に実行させる恐ろしい「未定義の動作」(特に、表現可能な範囲を超える符号付き演算)。
  • 整数型とポインタの長さが異なるアーキテクチャに移行するときの移植性の問題。

Cが本当に得意なのは次のとおりです。

  • C APIを提供する既存のライブラリセットとのやり取り。 Cはlingua francaであり、多くのプラットフォーム上のソフトウェアコンポーネント間の相互運用性を可能にします。

Cがかなり得意なのは、次のとおりです。

  • 移植性をある程度維持しながら、非常に低レベルのコード(たとえば、固定メモリアクセスパターンによるタイミング攻撃に耐性のある暗号コード)を作成する。

私の結論は、Cは一般にセキュリティ関連ソフトウェアを書くのに良い考えではないので、そうではありませんかなり長い間(少なくとも10年)です。 Cは、特に組み込みプラットフォーム(「スマートフォン」のように埋め込まれているのではなく、「スマートカード」のように埋め込まれている)をターゲットにしている場合など、特定のコンテキストで正当化されます。 Cから離れる理由を探す代わりに、Cを使い続ける特定の理由を探すほうがより正当化されます。

49
Tom Leek

あなたは安全なコードをCで書くことができます。言語がデフォルトで安全でないだけです。安全性は、追加のコード(もちろん、それ自体にバグが含まれる可能性があります)を使用して手動で取り組む必要があります。

そのため、Cはneverが、セキュリティが重要なソフトウェアにとって本当に最良の選択でした。とにかく、FOSSでは無料のコンパイラがほとんどすべてのプラットフォームで(定義上、gccがサポートするすべてのプラットフォームで)利用可能だったため、FOSSで使用されました。

特定の言語(Cなど)に縛られていない場合、セキュリティが重要なソフトウェアに対する一般的なアドバイスは、Adaを使用することです。その言語は、CまたはC++と同様の抽象化レベルにありますが、デフォルトで安全性(たとえば、すべての配列の自動境界チェック)にコードを追加してチェックをオフにする機能 、逆方向ではなく。

特に、安全性とセキュリティが重要なソフトウェア用に特別に設計された [〜#〜] spark [〜#〜] と呼ばれるAdaのサブセットがあります。そのようなことに興味がある場合は、ソフトウェアの正式な検証にも使用できます。

25
T.E.D.

まず、暗号化などの場合パフォーマンスが重要

これは、数百人のユーザーにサービスを提供できるか、一度に10人だけにサービスを提供できるかの違いです。そして、これにはある程度のセキュリティ関連性があります。サーバーが苦労している場合は、DOS攻撃で簡単に取り除くことができます。

純粋なpythonコードとネイティブコードの比較を行ったことがあれば、その違いがどれほど大きいかに驚かれるでしょう。

次に、CなしではPython/Javaはありませんです。どちらの「モダン」言語を見ても、その下にあるかなりの量のライブラリーを使用します。そして、これらの大部分はCライブラリです。

このような言語で「セキュリティクリティカル」なライブラリを作成する場合、心配する必要があります。1。独自のコードの問題2.使用するJava/Pythonコードの問題3.基礎となるCコードの問題(セキュリティは頻繁に発生します) Javaへの更新!)および4.その下にあるCライブラリの問題change知らないうちに(たとえばOSの更新)。 セキュリティ関連のコードが必要な場合は、依存関係を最小限に抑えます。

下のCの量は増加しており、減少していない。これは明らかではないようです。しかし、numpy、tensorflow、JavaFXなど...これらはすべて、その下で多くのCコードを使用しますパフォーマンスのため

注意深いエンジニアリングとverboseプログラミングにより、多くの問題を回避できます。たとえば、OSXの「goto fail」のバグはプログラマーによって引き起こされましたnot常にブラケットを使用するというベストプラクティスに従っている...

if (a)
  goto fail;
  goto fail;
somethingelse

ほとんどの言語でエラーを見逃しやすいです(Pythonを除き、同じ問題に必要なスペースが2つ少なくなります)。

if (a) {
  goto fail;
  goto fail;
}
somethingelse

pythonがこのような問題を回避するのに非常に役立つとは限りません(実際には、Javaコンパイラは到達不能コードについて警告します-Pythonはそうではなく、Cコンパイラはユーザーによって有効にされていれば可能です)...最後に開発者の規律は重要な要素のままです。

Cコードは通常、書くためにより多くの注意を必要とします。 notは品質にとって悪いことです。主な欠点は、開発が遅いことです。

Cは20年以上にわたって何百万もの人々に使用されてきました。 scanf()のようなセキュリティ上の欠陥はよく知られており、文書化されており、確立され、徹底的にテストされた回避策があります。

新しい言語、たとえばPerl 6またはpython 3は短期間しか使用されておらず、専門家はほとんどいません。まだ発見されていないセキュリティ上の欠陥が存在する可能性があり、重要なレビューがありますそして、ドキュメントはまばらです。

これらの新しい言語はどちらもCよりもはるかに「大きく」、はるかに多くの機能を備えています。また、すべての可能なプログラミング構造が使用されるまでに20年以上かかる可能性があり、そのセキュリティに自信を持っています。

2
Arif Burhan

これは低レベルであり、デフォルトでは完全に安全ではありません。もちろん、安全なソフトウェアを作成することは可能ですが、それを上手に行う必要があります。 OTOH:Cは低レベルであり、独自のセキュリティ問題がある可能性があるライブラリを含める必要はありません-これは可能性があります良いです。また、「安全な」言語とは、考えられるセキュリティの問題であるプログラムが含まれていることを意味します。

個人的に[〜#〜] i [〜#〜]はおそらくRust =十分に低レベルにすることができ、セキュリティにも重点を置いているため。

独自のランタイムを提供する場合を除いて、ネイティブではないコード(つまり、Java、C#などではない)を使用しない。もちろん、リンク先のすべてのライブラリにも同じことが言えますが、これは非ネイティブコードとは対照的に回避できます。

全体として、可能な限り最小限のコードに集中する必要があります。できるだけシンプルにし、他のコードを信頼しないようにします。それとは対照的に、それを回避できる場合は、安全なコードの作成を信用しないでください。通常、それは良くありません。

0
larkey