web-dev-qa-db-ja.com

エクスプロイトフリーのソフトウェアは可能ですか?

コード、ソフトウェアには常に脆弱性があると聞いています。しかし、私はなぜエクスプロイトフリーのソフトウェアを持つことができないのか理解していません。企業がソフトウェアを更新し続ければ、最終的に脆弱性はなくなりますよね?

139
Zheer

ソフトウェアが複雑すぎる

これは断然最も重要な要素です。 Webアプリケーションのようなものだけを見ても、コードベースに費やされる作業時間は計り知れません。このコードは、数十年前に書かれた何ページにもわたる標準であり、ほとんどの開発者が聞いたこともない機能を提供するテクノロジーで機能します。

それを現代のソフトウェアがライブラリに基づいて構築されているという事実と組み合わせると、ライブラリに基づいて構築され、一部のOS機能に基づいて低レベルのライブラリが抽象化されます。

現代の技術スタックは、OS側を除外しても、一人では完全に理解するには大きすぎるため、次の点につながります。

時間の経過とともに知識が失われる

SQLインジェクションは現在20年前のものです。 彼らはまだ周りにいます。 どうですか?考慮すべき1つの要素は、企業内の知識が時間の経過とともに失われることです。セキュリティを熟知していて、コードがSQLインジェクションに対して脆弱でないことを確認する1人または2人の上級開発者がいる可能性がありますが、それらの上級開発者は最終的には別のポジションに就いたり、会社を変更したり、退職したりします。新しい人が代わりをし、彼らは同じように優れた開発者であるかもしれませんが、彼らはセキュリティについて知りませんし、気にしません。その結果、彼らは問題を知らないか、気にしないかもしれず、したがってそれらを探しません。

人々は間違った方法で教えられます

もう1つのポイントは、セキュリティは実際には学校が気にするものではないということです。 JavaでのSQLの使用に関する最初のレッスンを思い出し、先生は文字列連結を使用してパラメーターをクエリに挿入しました。私は安全ではないことを彼に話し、レッスンを邪魔したことで怒鳴られました。このクラスのすべての生徒は、文字列の連結が方法であることを見てきました。結局のところ、それが教師のやり方であり、教師は間違ったことを教えることはないでしょう。

すべての学生は今や開発の世界に入り、誰も気にしないからといって、簡単に注入できるSQLコードを楽しく書いています。なぜ誰も気にしないのですか?なぜなら

企業は「完全なコード」に興味がない

それは大胆な発言ですが、本当です。会社にとって、彼らは投資と利益を気にします。彼らは開発者の時間(会社に特定の金額がかかる)を "投資"し、見返りに機能を期待して顧客に販売することができます。販売する機能は次のとおりです。

  • ソフトウェアはより多くのファイル形式で動作できるようになりました
  • ソフトウェアにアプリ内購入が含まれるようになりました
  • ソフトウェアが良く見える
  • ソフトウェアはあなたをよりよく見せます
  • ソフトウェアはより速く動作します
  • ソフトウェアはyourワークフローにシームレスに統合します

会社が売れないのはバグがないことです。 「ソフトウェアはXSSに対して脆弱ではありません」はあなたが売ることができるものではなく、したがって企業がお金を投資することを望んでいるものではありません。セキュリティの問題を修正することは、洗濯をするのによく似ています。とにかくそうする気はないかもしれませんが、それでもしなければなりません。

そしてもう一つの最後のポイント:

バグがないことをテストすることはできません

つまり、コードにバグが含まれているかどうかを確認することはできません。残っているバグの数がわからないため、一部のソフトウェアが安全であることを証明することはできません。これを示しましょう:

function Compare(string a, string b)
{
    if (a.Length != b.Length)
    {
        // If the length is not equal, we know the strings will not be equal
        return -1;
    }
    else
    {
        for(int i = 0; i < a.Length; i++)
        {
            if(a[i] != b[i])
            {
                // If one character mismatches, the string is not equal
                return -1;
            }
        }

        // Since no characters mismatched, the strings are equal
        return 0;
    }
}

このコードはあなたに安全に見えますか?あなたはそう思うかもしれません。文字列が等しい場合は0を返し、等しくない場合は-1を返します。だから問題は何ですか?問題は、一定の秘密が1つの部分に使用され、攻撃者が制御するもう1つの部分に入力がある場合、攻撃者は関数の完了にかかる時間を測定できることです。最初の3文字が一致する場合は、一致する文字がない場合よりも時間がかかります。

これは、攻撃者がさまざまな入力を試みて、完了するまでにかかる時間を測定できることを意味します。時間が長くなるほど、より多くの連続した文字が同一になります。十分な時間があれば、攻撃者は最終的に秘密の文字列が何であるかを知ることができます。これは サイドチャネル攻撃 と呼ばれます。

このバグは修正できますか?はい、もちろん。バグは修正できます。ただし、このデモンストレーションのポイントは、バグが必ずしもはっきりと見えるわけではないことを示すことであり、バグを修正するには、バグを認識し、修正方法を知っており、そうするインセンティブを持っている必要があります。

要約すれば...

私はこれが長い記事であることを知っているので、最後までスキップしたとしてもあなたを責めません。簡単に言うと、エクスプロイトフリーのコードを書くのは本当に大変であり、ソフトウェアが複雑になるほど指数関数的に難しくなります。 Web、XMLなど、ソフトウェアが使用するすべてのテクノロジは、コードベースに数千の追加の悪用ベクトルを提供します。さらに、雇用主はエクスプロイトフリーのコードを作成することさえ気にしないかもしれません-彼らは販売できる機能を気にします。そして最後に、エクスプロイトがないことを本当に確信できますか?それとも、次の大きなエクスプロイトが一般に公開されるのを待っているだけですか?

266
MechMK1

これを書いている時点での既存の回答は、バグのないコードを作成することの難しさと、なぜそれが不可能なのかに焦点を当てていました。

しかし、それが可能かどうか想像してみてください。それはどれほどトリッキーかもしれません。 「バグフリー」というタイトルを獲得したソフトウェアは、L4マイクロカーネルの1つです。これを使用して、ウサギの穴がどこまで進んでいるかを確認できます。

seL4 はマイクロカーネルです。 2009年にバグがないことが証明されたので、それはユニークです。つまり、自動化された証明システムを使用して、コードが標準に準拠したコンパイラーでコンパイルされた場合、結果のバイナリーは言語のドキュメントに書かれているとおりに正確に機能することを数学的に証明します。これは後で強化され、マイクロカーネルのARMバイナリの 同様のアサーション を作成します。

ARM seL4マイクロカーネルのバージョンのバイナリコードは、その抽象的な仕様で説明されている動作を正しく実装し、それ以上は行いません。さらに、仕様とseL4バイナリは、整合性と機密性と呼ばれる従来のセキュリティプロパティを満たします。 。

驚くばかり!正しいことが証明されたの重要なソフトウェアがあります。次は何ですか?

まあ、seL4の人々は私たちに嘘をついていません。彼らはすぐにこの証明には限界があることを指摘し、それらの限界のいくつかを列挙します

Assembly:seL4カーネルには、すべてのオペレーティングシステムカーネルと同様に、約340行のARM Assembly私たちの場合、seL4の場合、これは主にカーネルへのエントリとカーネルからの出口、およびハードウェアへの直接アクセスに関係します。証明のために、このコードが正しいと仮定します。
ハードウェア:ハードウェアが正しく動作すると想定します。実際には、これはハードウェアが改ざんされておらず、仕様に従って動作していると想定されていることを意味します。また、動作条件内で実行する必要があります。
ハードウェア管理:証明は、基盤となるハードウェアに関する最小限の前提のみを行います。キャッシュの一貫性、キャッシュのカラーリング、TLB(変換ルックアサイドバッファー)管理から抽象化されます。証明では、これらの関数が上記のアセンブリレイヤーに正しく実装されており、ハードウェアが宣伝どおりに機能していることを前提としています。証明では、特にこれら3つのハードウェア管理機能がカーネルの動作に影響を与えないことも前提としています。これは、正しく使用されている場合に当てはまります。
ブートコード:現在の証明は、カーネルにメモリが正しく読み込まれ、整合性が取られた後のカーネルの動作に関するものです。最小限の初期状態。これにより、カーネルプログラマが通常はカーネルの一部と見なすコードベースの約1,200行が除外されます。
仮想メモリ:「通常の」正式な検証プロジェクトの標準では、仮想メモリはこの証明の前提と見なす必要はありません。ただし、保証の程度は、第一原理から推論する証明の他の部分よりも低くなります。より詳細には、仮想メモリは、カーネルがユーザープログラムやユーザープログラムを互いに保護するために使用するハードウェアメカニズムです。この部分は完全に検証されています。ただし、仮想メモリは、カーネル自体がメモリにアクセスする方法に影響を与える可能性があるため、複雑になります。私たちの実行モデルは、カーネルの実行中のメモリの特定の標準的な動作を想定しており、カーネルの動作に必要な条件を証明することにより、この想定を正当化します。重要なのは、必要なすべての条件が揃っており、条件が適切であることを信頼する必要があるということです。私たちのマシンチェック済みの証明は、この時点で完了することを強制するものではありません。つまり、証明のこの部分では、他の部分とは異なり、人的ミスの可能性があります。
...

リストは続きます。正しさの証明を主張するときは、これらすべての警告を注意深く考慮する必要があります。

ここで、seL4チームにクレジットを付与する必要があります。このような証拠は、信じられないほどの信頼構築声明です。しかし、それは、「バグフリー」という考えに近づき始めたときに、ウサギの穴がどこに行くかを示しています。 本当に「バグフリー」になることはありません。大きなクラスのバグを真剣に検討する必要があるだけです。

結局、あなたはすべての中で最も興味深い人間の問題に出くわすでしょう:あなたは仕事に適したソフトウェアを使用していますか? seL4はいくつかの優れた保証を提供します。それらは実際に必要なものですか? MechMK1の回答は、一部のコードに対するタイミング攻撃を指摘しています。 seL4の証明には、それらに対する防御は明示的に含まれていません。そのようなタイミング攻撃が心配な場合、seL4はそれらについて何も保証しません。間違ったツールを使用しました。

そして、エクスプロイトの履歴を見ると、間違ったツールを使用してやられたチームでいっぱいです。

†。コメントへの応答:答えは実際には無料のコードを悪用することを語っています。ただし、コードにバグがないという証明は、エクスプロイトがないという証明には必要だと私は主張します。

92
Cort Ammon

高品質のコードを作成することはできますが、開発にかかる費用は非常に高くなります。スペースシャトルソフトウェアは 開発済み であり、細心の注意と厳密なテストにより、非常に信頼性の高いソフトウェアが得られましたが、PHPスクリプトよりもはるかに高価です。

さらに日常的なことも非常によくコーディングされています。たとえば、Linux TCP/IPスタックはかなり堅固で、セキュリティ上の問題はほとんどありませんでした(残念ながら、1つ 最近 )攻撃のリスクが高い他のソフトウェアには、OpenSSH、リモートデスクトップ、VPNエンドポイントが含まれます。開発者は通常、ソフトウェアの重要性を認識しており、特に事前認証攻撃で「セキュリティ境界」を提供することがよくあります。一般に、開発者はより優れており、セキュリティの問題は少なくなります。

残念ながら、いくつかの主要なソフトウェアはあまり開発されていません。注目に値する例は、非常に広く使用されているOpenSSLですが、内部が乱雑であり、Heart Bleedのようなセキュリティ上の欠陥を簡単に導入できます。これに対処するための措置が講じられました。 LibreSSL。

同様の影響がCMSソフトウェアでも発生します。たとえば、Word Pressのコアは一般に十分に設計されており、問題はほとんどありません。しかし、プラグインははるかに多様であり、多くの場合、古いプラグインはそのようなサイトがハッキングされる方法です。

Webブラウザはこれの最前線です。何十億ものデスクトップユーザーは、Webブラウザーを使用してセキュリティを保護し、マルウェアをシステムから隔離しています。ただし、高速で最新の機能をすべてサポートし、数百万ものレガシーサイトを処理する必要もあります。したがって、私たちは本当にWebブラウザが信頼できるセキュリティ境界であることを望んでいますが、現在はそうではありません。

オーダーメイドのソフトウェア(多くの場合Webアプリケーションです)に関しては、それらに取り組んでいる開発者は、コアインフラストラクチャの開発者よりも経験とセキュリティにあまり慣れていません。そして、商業的なタイムスケールは、彼らが非常に詳細で注意深いアプローチを取ることを妨げます。しかし、これは、慎重にコード化およびテストされた、セキュリティクリティカルなコードを小さな領域に含むアーキテクチャで役立ちます。非セキュリティクリティカルなコードはより迅速に開発できます。

すべての開発は、静的アナライザー、ファザー、ペンテストなどのセキュリティツールとテストで支援できます。一部は自動化されたCIパイプラインに組み込むことができ、より成熟したセキュリティ部門がすでにこれを行っています。

ですから、長い道のりがあります。将来的には、セキュリティバグが大幅に減少することを期待しています。そして私たちをそこに導く革新的な技術のための多くの機会。

24
paj28

はい...

他の人が指摘したように、コードを証明することは可能であり、そうすることで、コードが意図したとおりに機能することを実証できます。タイミングと非決定論的モデル(ネットワークの相互作用など)の証明の難しさは、不可能ではなく難しさの1つです。 MeltdownおよびSpectre へのパッチは、サイドチャネルタイミング攻撃でさえも対処および対処できることを示しています。

このようなコードを作成する主な方法は、コードを数学として扱うことです。コードを証明できない場合は、バグのないコードとして扱わないでください。できれば、あなたは...バグのないショットだけを持っています。

... だが ...

コードが原始的であることを証明できたとしても、意図した以外の方法でデータを解放できない、誤った状態や異常な状態にすることはできないなど、自前のコードには価値がないことを忘れないでください。開発者がそのような証拠のあるコードを記述しても、ハードウェアの脆弱性を含むハードウェアでそのコードを実行すると、ソフトウェアのセキュリティは問題になります。

暗号化されたデータをメモリから取得し、それをCPUレジスタに格納し、適切な変換をそのレジスタで実行して、データの復号化、処理、および再暗号化を行う単純な関数を考えます。ある時点で、暗号化されていないデータがレジスターにあることに注意してください。そのCPUハードウェアで使用可能なオペコードが、そのCPUレジスタを破壊しないプログラムで、実証済みのコードと並行して実行される可能性がある場合は、ハードウェアベースの攻撃があります。

つまり、最終的には、このようなエクスプロイトフリーのソフトウェアを使用するには、エクスプロイトフリーのハードウェアがあることを最初に証明する必要があります。 MeltdownとSpectre(他の多くの中でも)が実証したように、一般的に入手可能なハードウェアはそのマークを通過しません。

軍事仕様や宇宙仕様のハードウェアでさえ、このメトリックでは失敗します。 プロセッサのLEONライン は、軍事および宇宙への展開での使用を想定しており、 シングルイベントアップセット(SEU)およびシングルイベントトランジェント(SET) に対してのみ強化されています。これはすばらしいことですが、攻撃者がハードウェアを異常な状態にするのに十分な混乱と過渡状態を引き起こすのに十分な放射線のある環境に攻撃者がシステムを置く可能性が常にあることを意味します。

...そしてもっとお尻...

したがって、ソフトウェアとハ​​ードウェアの証明だけでは不十分です。ハードウェアの検証では、環境への影響も考慮する必要があります。 LEON4を十分な放射線に曝してケーシングを圧倒する場合ORにより、ケーシングに十分な誘導放射線が発生してプロセッサを圧倒する場合でも、収差を引き起こす可能性があります。この時点で、合計システム(ソフトウェア、ハードウェア、環境)は、そのような証明を試みるために完全かつ適切に定義することは非常に複雑です。

…いや、そうでもない….

コードを証明したRDBMSを考案し、ハードウェアを証明し、環境を証明したと仮定します。ある時点で、ようやくセキュリティチェーンの弱点にぶつかりました。

Idio ... er、Users。

私たちの輝かしいデータベースと輝かしい [〜#〜] pfy [〜#〜] は、安全でないシステムを作り出します。 PFY-より慈善的になり、彼らに 'JrOp'というタイトルを与えましょう... JrOpはデータベースにアクセスし、JrOpが知る必要のあるデータだけが与えられ、それ以上、それ以下はありません。輝かしい瞬間にJrOpsだけが集まることができるので、JrOpは同僚に寄りかかって、「User12358Wがアップロードしたばかりのものが見えましたか?これを見てください!」とつぶやきます。

セキュリティのために...

...最後の希望(そしてそれを不条理に打ち負かす)...

しかし、私たちが最終的に把握した未来の仮説 人間の意識 を想像してみましょう。人類はついにすべての人間の精神機能の科学的および技術的説明を達成しました。さらに、これにより、ユーザーに対してもシステムを証明できるようになります。適切なフィードバックシステムがシステムに組み込まれているため、JrOpは、JrOpに明らかにされたものを明らかにすることすら考えていません。私たちはメタ倫理と操作の問題を哲学者に任せることができます-哲学者と言えば...

すべてのステップで、プルーフを使用していることに注意してください。

「あはは」、歓喜で 幽門懐疑的 を叫ぶ。 「ZF/ZFC、ペアノ、非ナイーブセット理論、古典的命題論理などの正式なシステムは健全であると想定しました。なぜですか?」

どのような答えを出すことができますか? GodelとTarskiの間では、真実を正式に定義することもできません( Godelの不完全性定理 および Tarskiの定義不可能性定理 を参照)。したがって、「まあ、それは現実に沿ってシステムを使用するのは良いことです」とは、根本的に根拠のない仮定にすぎません。つまり、システムがエクスプロイトフリーであるという証拠は、最終的にそれ自体が仮定です。

...そうではない、そうではない。

バグのないコードを書くことは可能かもしれませんが、それを数学的な証明として書くことで、技術的には「悪用のないコード」というトップレベルの目標を達成することができますが、これにはコードを真空で見る必要があります。これにはいくつかの価値があります-それは価値のある目標です( "しかし、それは価値があると仮定しています-" "ほとんどの人はそうですPyrrhoに対処します")。ただし、その目標でこれまでに成功したことのある快適な思考を決して許さないでください。もしそうなら、コードに「HMS Titanic」というタイトルを付ける謙虚さを持ちましょう。

11
LRWerewolf

前の質問に横向きに答えたいです。バグのないソフトウェアが理論的に不可能だとか、そのソフトウェアが複雑すぎるとは思いません。エラー率がはるかに低い他の複雑なシステムがあります。

予見可能な将来にエクスプロイトフリーのコードが発生しない理由は2つあります。

パフォーマンスとその他の最適化

悪用可能な問題を含む多くの問題は、コードを正しく記述する方法がわからない場合ではなく、正しいコードが遅くなるというだけのことです。または、より多くのメモリを使用します。または、書くのにもっと費用がかかります。ソフトウェアでは、より多くの速度を上げるため、またはその他の利点のために、多くのショートカットが利用されています。これらのショートカットのいくつかはエクスプロイトのソースです

基本的な問題

今日ソフトウェアを作成するために使用するシステムには、悪用につながる根本的な欠陥がありますが、原則として不可避ではありません。私たちのコンパイラは安全であることが証明されていません。ライブラリシステム、特に自動化された依存関係を通じて数百または数千の小さなパッケージを動的に統合するNodeエコシステム(現在は作曲家、貨物などによってコピーされています)はhugeセキュリティです悪夢。私は72ptフォントを使用して、どれほど巨大かを示す必要があります。ほとんどすべての言語には、根本的に安全でない構造が含まれています(Rustは、それらのいくつかを示しています)。オペレーティングシステムはさらに多くの欠陥がある古いシステムでも。

要するに、現時点で私たちにできる最善のことは、基本的に「台無しにしないこと」であり、それだけでは複雑なシステムには十分ではありません。

結論

つまり、要約すると、現在のソフトウェアの世界ではありません。ささいな、または非常に自己完結型の(すでに述べたL4カーネル)コードについて話していない限り、これらのツールや考え方、開発環境ではエクスプロイトフリーのコードは不可能です。

ただし、理論的には、小さなモジュールからソフトウェアを構築することを妨げるものはなく、それぞれが正式に正しいことが証明されています。これらのモデルの関係、相互作用、およびインターフェースをモデル化し、それらの正当性を正式に証明することを妨げるものは何もありません。

実際、私たちは今日それを行うことができましたが、ソフトウェア設計の根本的な進歩がなければ、そのコードは実行されず、クロールされました。

8
Tom

出来ますか?はい。しかし、あなたが探しているソフトウェアのためではありません。

「バグ/エクスプロイトフリー」とは、基本的に、プログラムがあらゆる入力に対して賢明で安全な応答を持つことを意味します。これには、その入力を無視することが含まれます。

これを実現できる唯一のソフトウェアは、Hello Worldのすぐ向こうにある小さくてささいなプログラムです。これにはエクスプロイトはありません。

print("Hello World")

このコードはすべての入力を無視し、ハードコードされた文字列のみを出力するためです。

ただし、このコードは、ユーザーにとって有用な作業をまったく実行しません。

たとえば、インターネットに接続して何かをダウンロードする必要があるとすぐに、制御できない、悪意のあるデータをダウンロードすることになります。もちろん、私たちのダウンロードソフトウェアがあなたを守るためにそのデータに課している多くの制限がありますが、あなたが気付いていない脅威の角度から守ることは不可能です。

7
Gloweye

はい、システムのセキュリティが数学的に証明されている場合。それは新しいアイデアではありません 信頼できるコンピュータシステムの評価基準 、要するに「オレンジブック」は1985年に由来します。

enter image description here

それらの中で、A1という名前の最高レベルのセキュリティは、検証済みの設計がある場合です。これは、システムを破壊する方法がないことが数学的に証明されていることを意味します。

実際には、ソフトウェアの数学的な正確性(セキュリティを含む)を証明することは非常に難しく、非常に難しい作業です。私が知る限り、完全なコンピュータシステムにはそのような証拠はありませんが、一部のシステム(少なくとも VM/ESA カーネル)は部分的に証明されています。

また、ITセキュリティは本質的に、攻撃者がどこから来たのかわからない可能性のある攻撃に対処します。たとえば、このような数学モデルは問題なく、直接または間接的に、内部のTCP=通信を盗聴する方法がないと想定しているシステムで機能します。したがって、 A1証明書を取得します。実際には、このようなシステムは、侵害されたルーターで簡単に破壊される可能性があります。

一般に、プログラムの自動化された(または部分的に自動化された)正当性テスト。彼らのセキュリティテストは、数十年前からコンピュータサイエンス分野でよく行われています。多くの参考文献と博士号を取得しました。しかし、それは25年前のように、実際に広く使用されることにはまだ程遠いです。

はい

誰も 正式な検証 という名前で言及していないことに驚いています(ただし Cortの回答 は正式に検証されたL4マイクロカーネルについて言及しています)。

私は個人的には正式な検証にあまり詳しくないので、このトピックに関するWikipediaページの関連するいくつかのポイントを紹介します。詳細については、それを参照してください。

ハードウェアおよびソフトウェアシステムのコンテキストでは、正式な検証とは、数学の正式な方法を使用して、特定の正式な仕様またはプロパティに関してシステムの基礎となる意図されたアルゴリズムの正確性を証明または反証する行為です。[1]

ソフトウェアプログラムの正式な検証では、プログラムがその動作の正式な仕様を満たしていることを証明します。 [...]

設計の複雑さの増大により、ハードウェア業界での正式な検証手法の重要性が増しています。[6] [7] 現在、正式な検証は、ほとんどまたはすべての主要なハードウェア企業で使用されています、[8]ですが、ソフトウェア業界でのその使用は、まだ苦戦しています。[要出典] これは、エラーの商業的重要性が高いハードウェア業界でのニーズが高まっているためと考えられます。[要出典] [...]

2011年現在、いくつかのオペレーティングシステムが正式に検証されています:NICTAのSecure Embedded L4マイクロカーネル。OKLabsからseL4として市販されています。[10] OSEK/VDXベースのリアルタイムオペレーティングシステムORIENTAISはEast China Normal大学;[要出典] Green Hills SoftwareのIntegrityオペレーティングシステム。[要出典] およびSYSGOのPikeOS。[11] [12]

2016年の時点で、イェール大学とコロンビア大学の教授であるZhong ShaoとRonghui Guは、CertiKOSと呼ばれるブロックチェーンの正式な検証プロトコルを開発しました。[13]このプログラムは、ブロックチェーンの世界で最初の正式な検証の例であり、セキュリティプログラムとして明示的に使用されている正式な検証の例です。[14]

2017年の時点で、正式な検証は、ネットワークの数学モデルを通じて大規模コンピューターネットワークの設計に適用されており[16]、新しいネットワークテクノロジーカテゴリの一部として、インテントベースのネットワーキング[17]に適用されています。正式な検証ソリューションを提供するネットワークソフトウェアベンダーには、Cisco [18]、Forward Networks [19] [20]、Veriflow Systems [21]などがあります。

CompCert Cコンパイラは正式に検証されたCコンパイラです ISO Cの大部分を実装しています。

6
Dan Dascalescu

セキュリティでは、何もセキュリティで保護することはできず、強化することしかできないと信じたいです。

これは、ソフトウェアやアプリケーションをいくら更新しようとしても、 ゼロ日 が存在するためです。特にあなたのソフトウェアがハッキングする価値があるなら。つまり、セキュリティエンジニアのチームが問題にパッチを適用できる可能性がありますが、脆弱性が公開される前にソフトウェアが悪用される可能性があります。

ソフトウェアで作成するアプリケーションが多いほど、ゼロデイの可能性が高くなります。

5
s h a a n

それは可能ですが、現在存在しない規制がなければ経済的ではありません。

正しいカーネルseL4であることが証明されているという答えは、説明どおりに機能するという意味でバグのないコードの例を示すのに非常に優れています。説明が間違っている場合、エクスプロイトと呼ばれることもあります。しかし、説明/仕様のバグは比較的非常にまれであり、それらが本当にバグであるかどうかは議論の余地があります。

他の回答でも引用されている制限はすべて、「リソースが限られているため、カーネルに限定しました」と要約されています。これらすべては、seL4カーネルと同じ方法でハードウェアと周辺のソフトウェアおよびクライアントソフトウェアを開発することで解決できます。

だれもがこれを行った場合、たとえば、使用できるすべてのツールは証明できるほど正確で、ほんの少しの接着剤コードを書くだけなので、証明可能な正しいウェブサイトを書くことは簡単になります。したがって、小規模なプロジェクトで正しいことが証明される必要があるコードの量は少なくなります。現在のところ、小さな証明可能な正しいプログラムを作成する場合、正しいことが証明される必要があるコードの量は膨大です。なぜなら、コンピューターの開始以来開発されたツールを利用できなくても、基本的にゼロからやり直す必要があるからです。 。

今日、一部の人々は、デジタル化に対応して、監視や検閲、貿易封鎖や反撃などの抑圧的なツールを求めています。代わりに、たとえばソフトウェアおよびハードウェアの製造元から一定の責任(責任とも呼ばれます)を要求するなどして、安全なソフトウェアのインセンティブ化に切り替えた場合、安全なソフトウェアしかなくなります。完全に安全な方法でソフトウェアエコシステムを再構築するのに必要な時間は、そもそもそれを作成するのにかかる時間よりもはるかに短いでしょう。

5
Nobody

現在、十分に複雑なバグのないコードを書くことは非常にコストがかかります。実際にバグがないこと、または検証プログラムにバグがないことを確認するには、さらにコストがかかりますad infinitum。ほとんどの商用ソフトウェアの規模に対する解決策をすでに誰も持っていないと思います。

しかし、バグがあるかもしれないいくつかのプログラムには、少なくとも脆弱性がないと主張します。たとえば、ブラウザなどの完璧なサンドボックスで実行することになっているプログラムで、ユーザー以外には何も操作しようとしないか、少なくとも他のプログラムが信頼するはずの約束が文書化されていません。問題が発生している場合、それはプログラム自体ではなく、サンドボックスの脆弱性です。

異なる設計のプログラムの複数のバージョンが合意した場合にのみ結果を受け入れるシステムを設計する方法があります。そして、プログラムの一部をステートレスにする方法があります。これらの方法を使用して、promiseを再作成できます。サンドボックス化プログラムの複雑さは限られているので、遠い将来、使用されているすべてのアルゴリズムが証明可能である限り、最終的にエクスプロイトフリーのコードを記述できるようにする希望があると私は主張します。しかし、それが経済的に実行可能になるかどうかはわかりません。

3
user23013

ほとんどの回答は、エクスプロイトを可能にするバグに焦点を当てています。これは本当です。しかし、エクスプロイトにはより根本的な手段があります。

プログラムできる場合はハッキングされる可能性があります。

プログラム可能なすべてのシステムは、悪意のあることも含めて、愚かなことをするように指示することができます。
プログラマビリティはさまざまな形をとることができ、そのいくつかはあまり明白ではありません。たとえば、ワープロやスプレッドシートにマクロ機能があります。この機能は、ユーザーにシーケンスを提供します。さらに、選択と繰り返しを提供する機能がある場合、突然それは非常にプログラム可能です。

プログラムできない場合、ユーザーはより高い柔軟性を要求します。

ほぼすべての複雑なアプリケーションパッケージは、ユーザーが日常的な動作を自動化したい環境を最終的に作成します。この自動化は、PowershellやPythonなどのスクリプトの形式をとることもありますが、自動化のための追加のベルとホイッスルを備えたマクロ機能のようなものを経由することもあります。ビルダーがユーザーに対応するとき、それは突然プログラム可能なシステムになります。

2
Walter Mitty

不可解な建物 ...の「開発」という観点から考えて、考えられるいくつかのシナリオと仮定を考えてください。

  • 予算は限られていますか?いつもです!より大きな予算を持つ悪い俳優は、購入ツールを購入する、ビルダーに賄賂を贈るなどの方法で購入することができます。
  • 常に環境スケールがあり、それを超えて制御することはできません:地域は荒れ狂い、流星は重要な安全インフラストラクチャーを襲い、計画を立てる方法がなかったラインのさらに下の技術の進歩、...

この例では、想像力を駆使できます。

そして、建物はしばしば物理オブジェクトであると防御するのがより簡単であり、依存関係の長いチェーンまたはサードパーティのソフトウェアライブラリのように出所を確立することが難しいコンポーネントから構築されることはほとんどないという事実を受け入れます。

2
diginoise

理論的には、はい。

エクスプロイトフリーのソフトウェアは可能ですが、ソフトウェアをプログラムしてプログラム化することができれば、技術的にはこれは可能です。このようなものを作ろうとする人がいると聞いたことがありますが、見た目よりは難しいですが、プログラムを作成できるボットを作成するのは、思ったよりも難しいです。プログラムがエクスプロイトなしで利用できる別の方法は、ソフトウェアが数学的に証明されているである場合です。人間の入力。

1
yosh

完璧なコードを書くことは、完璧な車を作ることに似ています。私たちは完璧な車を作ることができるかもしれませんが、私たちがいる年齢のためにだけです。テクノロジーが成長するにつれて、アイデアが共有され、より多くの頭脳が問題を解決するために集まります。

企業がソフトウェアの開発を続けている場合、いつかはバグがなくなると言うのは正しいです。それは事実ですが、時間の経過とともにさまざまなテクノロジーが進化し、テクノロジーを最新の状態に保つか、同じ古い完全なコードベースに追いつくかを選択できます。

彼らは大きなグループであり、単一の製品に焦点を当てているので、facebookの例を見てみましょう。 Facebookは、数年前にすべての動的なものにjqueryライブラリを使用していました。これは最先端のテクノロジーであり、すべてが順調に進んでおり、それを置き換えることを考えたことはありませんでした。しかし、ユーザーの関心を維持するには、はるかにダイナミックになる必要がありました。 Facebookが成長し、ますます動的な機能を必要とし、jqueryが彼らのニーズを満たしていないことに気づきました。

他のWebサイトにはそれほど多くのユーザーがいなかったため、実際には新しいライブラリの必要性を理解している組織はありませんでした。そこで彼らは、Reactという独自のライブラリに取り組み始めました。時が経つにつれ、Facebookのおかげでより多くの人々がインターネットを使い始めたので、明らかに他のサイトにも紹介されました。今、他のウェブサイトもFacebookが直面していた問題を抱え始めましたが、幸いなことに、新しいウェブサイトを構築する代わりに、Reactライブラリでニーズを満たすことができました。

Googleも同様の問題を抱えており、FacebookのReactを使用する代わりに、特定のニーズに対処するために独自に構築することを考えていました。これは今後も継続し、完璧な単一のコードベースは存在しません。

より大きな何かが到着すると、より多くの人々がより大きく考え、それよりも優れた行動を起こすという自然の法則です。より多くの強力なキャラクターがアベンジャーズに登場し続けるのと同じです。

時間は唯一の一意のエンティティであり、時間に制限はありません。ビジネスオーナーと開発者はトライアドオフを行います。コード内のトライアドオフは次のようになります。

  • より最適化/高速化するため、またはより管理しやすくするため?
  • セキュリティに重点を置くか、ユーザーエクスペリエンスを向上させるために?
  • 新機能をもっとテストしたり、新機能を予定通りに出荷したりする必要がありますか?

私たちはこれらのトライアドを毎日オフにします...

1
omer Farooq

特定のケース(プログラム)の場合、ほぼ通常、NO

  1. 特定の場合:

ほとんどまたはすべての既知の脆弱性(つまり、バッファオーバーフロー)が解消されるまで、特定のプログラムを繰り返し改良できますが、多くの形式の脆弱性がソースコードの外部で発生します。たとえば、ほとんどまたは完璧なプログラムをコンパイルするとします。これにより、配布するオブジェクトまたは実行可能プログラムが生成されます。ターゲットコンピュータでは、マルウェアにさらされてバイナリコードが変更される可能性があります。つまり、元のプログラムには存在しない悪意のあるコードへのジャンプが挿入されます。

  1. 一般に

現在または将来、anyプログラムのソースコードの脆弱性を検証できるプログラムを作成することは可能ですか?

少し理論。脆弱性のないプログラムであることは、プログラムの semantic プロパティであり、構文のプロパティではありません。構文プロパティは形式化できます(したがって、形式メソッドで検出できます)が、セマンティックプロパティは次のことができません。

セマンティックプロパティは、些細なセマンティックプロパティではないプロパティです。些細なセマンティックプロパティとは、すべてのプログラムに常に存在するか常に存在しないプロパティです。プログラムのよく知られたセマンティックプロパティは「This program will forever forever」(有名なTuringの halting problem )です。他はしません。トリノ 証明済み 停止の問題は 決定不能 であるため、プログラムの停止の性質をテストする正式な方法は存在できません。

ライスの定理 は、プログラムの重要な意味的プロパティもすべて決定できないことを示しています。実際、証明は、プログラムの重要でないセマンティックプロパティが決定可能である場合、停止しているプログラムを解決するために使用でき、これは不可能であるという事実に基づいています。

セマンティックプロパティの別の例として、プロパティ「This program is harmful」を考えます。もちろん、これはセマンティックプロパティであるため、ライスの定理の結果として、正式で確定的なマルウェア検出プログラムを構築することはできません。それらのほとんどは、検出手順にヒューリスティックを使用しています。

もちろん、マルウェア検出で使用されるため、ヒューリスティック、人工知能、機械学習などを使用して、コード内の脆弱性を検索する方法にアプローチできますが、正式で完全で確定的なものは存在できません。

1

ソフトウェアテストの最初のルール(QA):

'最後のバグが見つかったことを確認できません'。

私は1980年からコード化しており(電子工学エンジニアでもあり)、ソフトウェアのnoneが悪用されました。それは、それが不可能であったということではなく、だれもそれをしなかったということです。銀行システム(および「スノーデン」のようなシステム)には、許可されていないアクセスをログに記録する自動トリガー警告/監査があります(私は同様のシステムで作業しました)。

では、はい、無料のソフトウェアを悪用することは可能ですが、それをどのように定量化/検証しますか?

最後に、FCC(米国)の規則を調べます。

ライセンスのないデバイスを管理するFCCルールのパート15には、米国のスペクトラムポリシーの基本原則が組み込まれています。ライセンスのないデバイスは、あらゆる発信元からの干渉を受け入れる必要があり、ライセンスされたサービスに有害な干渉を引き起こしてはなりません

つまり、Wi-Fi信号が「悪用可能」であり、その上にあるソフトウェアが「悪用可能」であることを意味します。

0
Mr. de Silva