
OSDP攻撃ツール(エルフ語で「友」の意)
OSDPは暗号化をサポートしていますが、厳密には必須ではありません。そのため、接続がまったく暗号化されていない可能性もあります。攻撃その1では、パッシブに傍受して、線路上のカード番号を読み取れるかどうかを確認します。
コントローラとリーダーが暗号化をサポートしているからといって、それが使用されるように要求する設定になっているとは限りません。攻撃者はリーダーの能力応答メッセージ(osdp_PDCAP)を改ざんし、暗号化をサポートしていないと偽装できます。これが発生すると、一部のコントローラは暗号化なしでそのまま動作を続けます。
OSDPには、リーダーとコントローラの両方に適用される準公式の「インストールモード」があります。名前が示すように、これはリーダーを初めてセットアップするときに使用されることを意図しています。その機能は、基本的にリーダーがコントローラにベース暗号鍵(SCBK)を要求できるようにすることです。コントローラが恒久的にインストールモードに設定されている場合、攻撃者は線路上に現れてSCBKを要求できます。
OSDPのサンプルコードには、ハードコードされた暗号鍵がよく含まれています。明らかにこれらはサンプルであり、ユーザーは自分で安全に鍵を生成することを想定されています。しかし、これは説明されておらず、ユーザーにとって簡単でもありません。そして、セキュリティの分野に長く携わっている人なら誰でも、デフォルトの設定は本番環境でもそのまま使われがちであることを知っています。
そのため、攻撃ベクトルとして、リーダーとコントローラ間のリンクが暗号化されている場合、一般的な弱い鍵を列挙してみる価値があります。これらは128ビットAES鍵であるため、すべてを列挙することはできません。あるいは有意義な部分さえも。しかし、誰かが鍵をハードコードする際によく見られるパターンをいくつか試すことはできます。
OSDPには、鍵交換のためのインバンドメカニズムがありません。つまり、攻撃者は以下のことが可能です。
これらの各攻撃の概念実証コードは attack_osdp.py にあります。使用法の詳細については、--help コマンドを確認してください。これはPythonスクリプトで、USB<-->RS485アダプタを搭載したラップトップから実行することを想定しています(このようなもの)。そのため、いくつか用意するとよいでしょう。ただし、そのモデルでなくても構いません。
テストしたいコントローラがあれば素晴らしいです。それを使ってください。ない場合は、ここに意図的に脆弱性を持たせたOSDPコントローラを用意しています:vulnserver.py。
attack_osdp.py の一部の攻撃は、機能しているリーダーとコントローラの間での完全なMitM(中間者攻撃)を前提としています。これらをテストするには、ブレッドボードで接続した3つのUSB<-->RS485アダプタが必要になるかもしれません。
これらの問題は単独では悪用可能ではありませんが、それでもプロトコル、実装、またはシステム全体の弱体化を表しています。