質問

私の会社では、いくつかのサーバーで構成される大規模なシステムを開発しています。このシステムは、約5つの論理コンポーネントから構成されています。データはXMLS、MS SQL、およびSQLiteに保存されます。それは.NETシステム(ほとんど)であり、コンポーネントはWCFを使用して通信し、いくつかのカスタムUDPです。クライアントは、主にカスタムUDPまたはWeb(ASP.NET&Silverlight)を介してシステムにアクセスします。

通信を保護することは簡単で、SSL、およびWCFのセキュリティがあり、私たちは完了です。

私たちが直面している主な問題は、システムをクライアントのサイトに展開する必要があることです。クライアントは、必ずしも信頼していないクライアントです。サーバー上のデータと、ソフトウェア自体をリバースエンジニアリングから防御する必要があります。どちらも私たちにとって非常に重要です。

また、キルスイッチが必要です。コマンド時にデータとソフトウェアを破壊するもの、または一定期間家に電話することができない場合が欲しいです。

私が考えていた方向は、TPM、または何かの両方を使用することです - いくつかのハードウェア暗号化ソリューションは、サーバー上のすべてのソフトウェアとデータを暗号化するために内部的に維持できる別のサービスと組み合わせて、キーがサーバーから来るようにすることです私たちのサイトで安全に、そしておそらくTPMからのメモリがカーテンになります。

そのような問題を解決することをどのように提案しますか?


アップデート 04/02私は実用的な提案を探しているか、私を助けることができる製品についてアドバイスしているので、私は恵みを始めます...

私たちが基本的にマシンをクライアントのサイトに入れている人を見てください(ビジネスと実用性の理由から)、私たちはそのマシンを所有し、クライアントは数時間以内に支払っているものをすべて受け取り、彼が望むものを何でもできることを行うことができます。しかし、私はそのマシンで実行されているアルゴリズムと、そこに保存されているデータの一部は、保護したい企業秘密があります。理想的には、マシンが大丈夫だと言わなければ、マシンが起動しないようにして、マシン上のすべてが暗号化されたままであることがなければ、起動しないようにしたいと思います。メモリカーテンは、実行中にマシンを保護する良い方法のようにも見えます。

また、理想的には、すべてのマシンのHDとストレージがドライバーで誰かが近づくとすぐに爆発したいと思います... :-)


アップデート 10/02 OKいくつかの調査を行った後、私たちはPS3暗号化システムと同じ方向に何かを試すつもりだと思いますが、ソフトウェアとサーバーのデータを復号化するためのキーを持ち込むことを除いて。そうすることで、キーをリクエストするサーバーが信頼できるかどうかをマシンに決定できます。マシンを再現するだけでキルスイッチを取得できます。これはおそらくTPMまたは似たようなものに基づいています。おそらくIntelのTXT ...私は重要なセキュリティ機能としてのメモリカーテンにも本当に興味があります...

ところで、ビジネス要件の両方と技術的に実現可能ではないため、システムの貴重な部分をサイトに移動することでこれを解決することはできません。巨大な帯域幅が必要になります。

役に立ちましたか?

解決

あなたが求めているのは、事実上、聖杯です。これは、トラストされていない環境で実行されている信頼できるプラットフォームがあるゲームコンソールで行われていることとほぼ同等です。

1日目からマシンを妥協していると扱うことができるかどうかを検討してください。その仮定の下で作業できる場合、物事はかなり簡単になりますが、ここではそれはひどく実行可能ではありません。

実際にそれを確保するという点では、いくつかの懸念があります。

  • ファイルシステムを暗号化し、ハードウェアの復号化を使用する必要があります
  • セキュリティの問題が他人を妥協しないように、アプリケーションを互いに隔離する必要があります
  • セキュリティの問題を計画する必要があります。つまり、安全なハイパーバイザーのような緩和戦略を配置することを意味します

これらはかなり曖昧であることは知っていますが、これは本当にここ数年のゲームコンソール保護の歴史です。 。

完全に正常に行われたことはありませんが、障壁を大幅に上げることができます。

他のヒント

...正直に言うと、あなたはあなたのアプリケーションにウイルスを書き込む方法を尋ねているように聞こえます。

とはいえ、これはいくつかの理由でひどい考えです:

  1. インターネット接続が死んだり、オフィスを移動したり、マシンを少し外したりするとどうなりますか?
  2. 間違ってコーディングしてミスファイアをするとどうなりますか?顧客が正しく使用している場合でもデータを削除しますか?
  3. あなたのリクエストは、あなたのアプリケーションがバックアップ機能を提供していないことを暗示していると仮定することができます。私は正しいですか?私が買わない製品のように聞こえます。
  4. アプリケーションが管理するデータはどれほど価値がありますか?それが削除された場合、これはクライアントにとってどのような経済的損失をもたらしますか?あなたの法務部門はこれに署名し、あなたが責任を負うことができないことを確認しましたか?

この質問は週に2〜3回尋ねられますが、答えは常に同じです - ユーザーに与えたものはもうあなたのものではありません。

ユーザーがデータにアクセスすることを難しくすることはできますが、彼が完全にそこに到達するのを防ぐことはできません。データを暗号化でき、USB Cryptotoken(秘密キーを公開しない)に復号化キーを保持できますが、理論的には、コードがCryptotokenに電話してデータの塊を復号化するように依頼すると、ハッカーは複製できます。コード(理論的に)およびこのコードを呼び出して、すべてのデータを復号化します。

実際には、データを取得するのに実行不可能にするのに十分な複雑にすることができます。この時点で、復号化されたデータがユーザーにとってどれだけ重要であるかを確認する必要があります。

キルスイッチについて: :これはうまくいきません。一度もない。ユーザーはコピーを作成し、必要に応じてバックアップから復元できます。彼はコンピューターの時計を変更できます。彼はおそらくコンピューターの時計を遅くすることさえできます(データが非常に価値がある場合、カスタムエミュレーションハードウェアへの投資が実行可能です)。

重要なデータについて: :時には、あなたの貴重な資産は他の誰にとってもほとんど価値がないことがわかります[そしてあなたのソリューションの他の側面は]です。例:ドライバー製品のソースコードを出荷します。それは私たちにとって最も価値のある資産ですが、ユーザーはコードのラインではなく、サポート、更新、その他の利点に対して支払います。ユーザーは、ライセンスのコストに匹敵する合計を投資せずに[盗まれた]ソースコードを効果的に使用することはできません。

難読化について: :コードの仮想化(vmprotect製品など)の仮想化は非常に効果的であると思われますが、特定の努力でバイパスすることもできます。

一般に、現金装置のように密閉されたカスタム構築オペレーティングシステムを備えたカスタムハードウェア(シールを壊さずにクライアントが入ることができないように)を考えることができます。これは、これが機能する可能性があります。したがって、タスクは技術的なだけでなく、ほとんどが組織的です。マシンなどの定期的な検査を手配する必要があります。

要約する: :データがある場合 それ 貴重で、サーバーにそれを保管し、インターネット接続のみを提供してください。それ以外の場合は、リスクを最小限に抑え、完全に回避することはできません。

他のみんなが言ったように、魔法の弾丸はありません。ユーザーは、マシンの電源を切って、HDを他のマシンに奴隷として取得し、すべてをバックアップし、コードをリバースエンジンしてから、それを成功させることができます。ユーザーが実行可能ファイルに物理的にアクセスできるようになると、潜在的に侵害され、100%のケースで停止することは何もありません。

あなたができる最善のことは、潜在的なクラッカーの仕事を地獄のように激しくすることですが、あなたが何をしても、それは壊れないでしょう。

何かが間違っている場合に自己破壊を使用すると、すべてをバックアップするクラッカーによって回避できます。

USBドライバーにキーを使用すると、クラッカーの寿命を難しくするのに役立ちますが、最終的に有能な決定クラッカーによって敗北する可能性があります。それは大きな弱点です。コードのその部分をハッキングしてキーをどこか他の場所に保存すると、キーが倒されます。

ソフトウェアがリモートサーバーで認証を行う場合、これはクライアントを攻撃し、認証を回避することで機能します。サーバーからキーを取得した場合、ネットワークをスニッフィングすることを使用して、キーを含むサーバーデータをインターセプトできます。サーバーデータが暗号化されている場合、クラッカーは、それを暗号化しないソフトウェアを分析し、暗号化されていないデータを釣り込むことにより、暗号化できません。

特別な場合、エミュレータを使用してメモリのスナップショットを保存できるソフトウェアを実行すると、クラッカーがはるかに簡単になります。ソフトウェアを実行中にメモリを直接操作してピン留めすることができれば、さらに簡単です。

信頼されていないクライアントが非常に決定されているとは思わない場合は、物事を複雑にし、それを壊すのに十分なエネルギーとスキルを得ることができないことを期待できます。

私の意見では、より良い解決策は、信頼できるサーバー内のすべてのソフトウェアを取得し、サーバーにサーバーにジョブを実行するように依頼し、サーバーにアルゴリズムを維持することです。これは、基本的な問題を削除するため、他のすべてよりもはるかに安全でシンプルです。ユーザーがアルゴリズムに物理的にアクセスできないからです。クライアントにコードを維持するためのニーズを排除することにより、本当に、これを行う方法について本当に考えてください。ただし、これでさえ壊れないことでも、ハッカーは、入力の関数の出力とは何かを分析することにより、アルゴリズムが何をするかを推測できます。ほとんどのシナリオでは(これがそうであるようには見えません)、アルゴリズムはシステムで最も重要ではありませんが、代わりにデータはそうです。

したがって、信頼されていないパーティーでアルゴリズムの実行を本当に避けられない場合、あなたがすでに言ったこと以上のことをすることはできません:すべてを暗号化(ハードウェアで好む)、すべてを認証して確認し、誰かの前に重要なデータを破壊します何かが間違っていると疑っているなら、それをバックアップすることを考え、誰かがそれを割るように地獄のようにそれを困難にします。


しかし、あなたが本当にいくつかのアイデアが欲しいなら、本当にこれをやりたいなら、ここに行きます:

プログラムミュータントを作成することをお勧めします。 IE:コードを復号化するときは、別のキーで暗号化し、古いキーを捨てます。サーバーから新しいキーを取得し、キー自体が、侵害された新しいキーを提供するものでサーバーをモックするのが非常に難しいという方法でコーディングされていると主張します。キーが一意であり、再利用されないことを保証します。繰り返しますが、これは壊れないことではありません(そして、クラッカーが最初にすることは、このまさに機能を攻撃することです)。

もう1つ:アルゴリズムの非機能的な偽物バージョンの多くのバージョンがあり、効果的に何もしない、それが実行されることを主張する多くの複雑なオーバーブロートを追加する、非センスの奇妙な一貫性チェックを行う多くの非自明な赤いニシンを入れてください。実際のコードから予想どおり。実際のコードに、奇妙で非センスも見えるいくつかのことをしてください。これにより、デバッグとリバースエンジニアリングがさらに困難になり、クラッカーがジャンクと役立つものを分離しようとするために多くの努力が必要になります。

編集:そして明らかに、ジャンクコードの一部を正しいコードよりも良く見えるので、クラッカーが最初にそこを見て、効果的に時間と忍耐を失います。言うまでもなく、すべてを難読化するので、クラッカーが暗号化されていないプレーンの実行中のコードを取得しても、それはまだ混乱して非常に奇妙に見えます。

私は他の人がおそらくこの解決策に穴を突いることを知っています - そして、私はこの種のことを生計のためにして、挑戦を歓迎するので、自由にそうしてください! - しかし、なぜこれをしてみません:

  1. Windowsを明確に使用しているため、最大セキュリティ設定でハードドライブでビットロッカードライブ保護を有効にします。これは、私の理解としてドライブをクローン化する人々を軽減するのに役立ちます - 私が間違っているなら、そう言ってください! - そのコンテンツは、そのシステムハードウェア設定に基づいて暗号化されます。

  2. ハードウェアでTPMを有効にし、ソフトウェア用に正しく構成します。これは、ハードウェアのスニッフィングを停止するのに役立ちます。

  3. あなたが使用していないアカウントを無効にし、システムアカウントとグループをロックダウンして、必要なもののみを使用します。 Active DirectoryとSecured VPNをセットアップするためのボーナスポイントにより、バックドアを介してネットワークにリモートでアクセスして、公式のオンサイト訪問を行わずにシステムを確認できます。

  4. これに到達するために必要な技術用バーを上げるには、MSILバイトコードが公開されている無料ツールによってソースコードに簡単に縮小できるため、C ++または他の非.NET言語でソフトウェアを作成します。適切なツールで非常に実行可能であっても、組み立ての何か。使用するハードウェアのすべてのCPU命令を有効にして、問題をさらに複雑にするようにしてください。

  5. ソフトウェアに、展開されたシステムのハードウェアプロファイル(一意のハードウェアID)を頻繁に検証してもらいます。これが失敗した場合(ハードウェアが変更されたように)、自己破壊します。

  6. ハードウェアが検証されたら、暗号化されたバイナリイメージからソフトウェアをロードし、暗号化されたRAMディスクにロードされ、それ自体が(ピンなし!)メモリでクリップされます。それを固定しないでください、またはそれは悪い考えであるため、一定のメモリアドレスを使用しないでください。

  7. 一部のコンパイラが愚かに担保付きのBzero/Memset0コールを愚かに最適化し、キーをメモリにしたままにするため、復号化が完了すると、キーがRAMからキーが削除されることに非常に注意してください。

  8. セキュリティキーは、他のメモリブロックに関連してランダム性によってメモリで検出できることを忘れないでください。これを軽減するために、使用すると侵入検知をトリガーしてシナリオを爆発させる複数の「ダミー」キーを使用してください。キーが使用するメモリをピン留めするべきではないため、これにより、人々は同じダミーキーを複数回トリガーできます。ボーナスポイントすべてのダミーキーをランダムに生成できる場合、そして実際のキーは毎回#12のために異なります。

  9. 多型アセンブリコードを使用します。アセンブリは、実際には、スタックの指示と状態/以前に呼ばれたものに基づいて自己修正できる数字にすぎないことを忘れないでください。たとえば、単純なi386システムでは、0x0f97(上記の場合はbyteを設定)は、単純に引くことで簡単に正反対の命令を簡単に正反対にすることができます。ハードコアになりたい。

  10. システムが現在の日付/時刻を理解し、現在の日付/時間が許容範囲内であることを確認してください。展開の前日から、4年の限界を与えることは、保証/サポートの下でハードドライブのハードウェア障害のベル曲線と互換性があり、そのような保護を利用して、ハードウェアの更新間の楽しい時間を確保できます。この検証が失敗したとき、それを殺すようにします。

  11. PIDファイルが現在の時間で頻繁に更新されることを確認することにより、人々が時計でねじ込んでいる人々を緩和するのを助けることができます。最後の変更された時間(暗号化されたデータとファイルシステム上のファイル属性の両方)を現在の時間と比較すると、人々が時計でねじ込まれている場合の早期警告システムになります。検出された問題については、爆発します。

  12. すべてのデータファイルは、コマンドで自分自身を更新するキーで暗号化する必要があります。少なくとも週に1回、そして再起動するたびにシステムを更新するようにシステムを設定します。これをソフトウェアの最新情報に追加してください。

  13. すべての暗号化は、FIPSガイドラインに従う必要があります。したがって、強力な暗号を使用し、HMACSなどを使用してください。現在の状況を考慮して、FIPS-140-2-LEVEL-4仕様をヒットしてみてください。 -2レベル-2はあなたの限界かもしれません。

  14. すべての自己破壊の場合において、最初にあなたに電話をかけてもらい、何が起こったのかをすぐに知ることができます。

そして最後に、いくつかの非ソフトウェアソリューション:

  1. 電話がかからない場合..最後の溝の取り組みとして、リレーをアクティブにするように設定された内部シリアル/USBポートに接続されたカスタムハードウェアデバイスは、ケース、ハードウェア、またはソフトウェアの改ざんを検出した場合にThermiteのブロックを設定するように設定します。 。ハードドライブの上に置いて、これらをマザーボードの上に置くと、最善を尽くします。ただし、私が米国にいると仮定しているため、これが米軍承認済みの状況ではない場合は、許可証など、法務部に確認する必要があります。

  2. ハードウェアが改ざんされていないことを確認するには、システムが物理的に安全であることを確認するための詳細については、FIPS物理セキュリティ要件を参照してください。ボーナスポイントは、ハードウェアの動き/改ざんを軽減するために、古いAS400ケースに使用している最新のラックをカモフラージュとしてボルトで溶接/溶接することを確認できる場合。若い人たちは何をすべきかわからず、「古いものを吸う」を壊すことを心配します、年上の人は「WTF?」と不思議に思うでしょう、そして、ほとんどの人は、頻繁に改ざんする場合、改ざんの証拠として後で使用できます。少なくとも私自身の経験に基づいて、鋭いエッジのケース。

  3. 侵入通知の場合、軌道からそれを核にしてください。それは確かに唯一の方法です。 ;)アクセスのすべての法的フォームと要件が記入されていることを確認してください。爆発した通知。

「完全に安全なシステムを持つ唯一の方法は、ハンマーでそれを粉砕することです」

そうは言っても、ハッカーになり、それが価値があるよりも多くのトラブルを起こすのに十分なほどのハッカーとねじ込むことができます。マシンが真に直接アクセスできないが、代わりにそれを扱うプログラムを持っている「ブラックボックス」である場合、それに対する最大の脅威は物理的なアクセスです。ケースをロックダウンしたり、小規模で壊れやすいアイテムをケースにインストールすることもできます。ケースが開かれた場合にスナップされます...サービスの人々が常にこのアイテムを交換してください...誰かが開いた場合に通知されます許可なしに(はい、それは古いティーンエイジャーのトリックですが、うまくいきます)。ボックス自体については、絶対に必要のないハードウェア(USBポートなど)のビットを物理的に無効にします。

ブラックボックスではないマシンを扱っている場合は、すべてから地獄を暗号化してください... 256ビット暗号化は、キーなしではクラックすることは事実上不可能です...それからトリックがキーを得るようになります。

理論的には、潜在的にキーを持つことができます 変化する (データを再クリップすることにより)(安全な)サーバーと直接通信するプロセスによってのみ取得可能になります。

さらに、ボックスに発生するすべて、特に通常の使用以外のソフトウェアで発生するすべてのものを追跡します。これの多くは、本当に、本当に決心している人からあなたを守ることはできません...しかしそれは できる あなたのシステムが妥協されていることを警告してください。 (あなたは侵入した人から一体訴えることができます)

キルスイッチについては...まあ、寝台車はそこにありますが、言われているように、彼らは偶然にだまされたり、偶然出発することができます。違反を疑っている場合は、自分自身をきれいに拭くのではなく、システムにランダムに生成されたキーでできる限りのものを暗号化し、サーバーにキーを送信し(ダメージを元に戻すことができます)、その後、キーを送信してから「シュレッド」キーを含むために使用されるファイル。 (そこにある多くのファイルシュレッダーは、(ほとんど)回復することができないほど十分にデータを破壊する可能性があります。)

答えを要約します、はい。この問題に対する「完全に安全な」ソリューションは必要ありません。 同種暗号化 (現在、とんでもない量の計算を必要とする限られたプロトタイプの形でのみ存在します)。

実際には、必要なのは、適切な要件エンジニアリングとセキュリティエンジニアリングの組み合わせです(利害関係者、利益、展開されたシステム内の貴重な資産、それぞれの成功した攻撃シナリオからの攻撃と損害の可能性と、それから防御するコスト)の組み合わせです。

その後、保護が実際には必要ないことがわかります。または、合理的な手段を展開して他の「穴」を法的なものでカバーするか、ビジネスモデルから始めてシステムを完全に再設計することができます(ありそうもないが、しかしあり得ないが、可能です)。

一般的に、セキュリティはシステムエンジニアリングの問題であり、技術的なアプローチのみに限定すべきではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top