
Hyperledger Fabric ブロックチェーン向けチェーンコードは、他のチェーンコードに正確な時刻を提供します。これにより、トランザクション時刻の改ざんに関連するセキュリティ問題(CVE-2024-45244)を解決します。
hlf-time-oracle は、ブロックチェーン Hyperledger Fabric のチェーンコードで、他のチェーンコードに正確な時刻を提供します。hlf-time-oracle は ntp パッケージ と nts パッケージ に基づいています。これにより、ブロックチェーンクライアントによる トランザクション時刻の改ざん に関連するセキュリティ問題 (CVE-2024-45244) を解決します。このチェーンコードは、GetTimeNtp() 関数と GetTimeNts() 関数を提供します。これらの関数を呼び出すと、NTP (Network Time Protocol) サーバーと NTS (Network Time Security) サーバーへの呼び出しが作成されます。これらのいずれかのサーバーから受信した時刻を使用して、クライアント側で定義されたトランザクション時刻の正しさを検証できます。ブロックチェーン用チェーンコードの開発者は、NTP サーバーおよび NTS サーバーとやり取りするコードを独自に記述する代わりに、hlf-time-oracle を使用できます。hlf-time-oracle は、動作中にブロックチェーンへデータを保存しません。
Hyperledger Fabric バージョン 2.4.x 用の hlf-time-oracle は hlf_2.4 フォルダーにあります。Hyperledger Fabric バージョン 2.5.x 用の hlf-time-oracle は hlf_2.5 フォルダーにあります。
単一のタイムサーバーに依存したくない場合は、複数のタイムオラクルを使用できます。
オラクル
NTS は NTP の拡張です (RFC 8915 を参照)。接続は 2 つあります: TLS 用の TCP と NTP 用の UDP です。NTP 接続のポートは NTS サーバーによって決定され、標準の 123/UDP とは異なる場合があります。ファイアウォールを設定する際はこの点に注意してください。
正しい TLS 接続を確立するには、クライアント (つまり hlf-time-oracle が実行されているシステム) のシステム時刻が比較的正確 (NTS サーバー証明書の有効期間内) である必要があります。そうでない場合、接続は確立されません。
GetTimeNtp() の代わりに GetTimeNts() を使用することをお勧めします。NTP とは異なり、NTS の使用は中間者攻撃に対して耐性があります。オープンデータ部分が不正に偽装された場合、次のエラーが記録されます: authentication failed on client。NTS サーバー証明書を偽装しようとした場合、次のエラーが記録されます: key exchange failure: tls: failed to verify certificate: x509: certificate signed by unknown authority。
モデル
hlf-time-oracle は docker (docker ネットワーク 172.18.0.0/24) 内で実行されています。docker ホスト (Host_1) 上では、netsed (ポート 4000/UDP) と mitmproxy (ポート 8080/TCP) が実行されています。hlf-time-oracle からそれらへのトラフィックは iptables を通過します。2 番目のホスト (Host_2) は、オラクルの GetTimeNtp() 関数と GetTimeNts() 関数に (peer chaincode query 呼び出しを介して) アクセスします。これらの関数を呼び出すと、オラクルはそれぞれ NTP サーバーと NTS サーバーに呼び出しを行います。
netsed にトラフィックをリダイレクトする iptables ルール:
iptables -t nat -A PREROUTING -s 172.18.0.0/24 -d 213.234.203.30/32 -p udp -m udp --dport 123 -m udp -j REDIRECT --to-ports 4000
ルールを指定して netsed を実行します。
netsed で %ea%33 を %eF%33 に置き換えるルールを作成します
攻撃が成功した結果。
netsed にトラフィックをリダイレクトする iptables ルール (NTS サーバー ntp1.glypnod.com の IP アドレスは 104.131.155.175):
iptables -t nat -A PREROUTING -s 172.18.0.0/24 -d 104.131.155.175/32 -p udp -m udp --dport 8123 -m udp -j REDIRECT --to-ports 4000
ルールを指定して netsed を実行します。
netsed で %ea%33 を %eF%33 に置き換えるルールを作成します
攻撃が失敗した結果。
docker ログを確認しましょう:
docker ログ
mitmproxy にトラフィックをリダイレクトする iptables ルール (NTS サーバー ntp1.glypnod.com の IP アドレスは 104.131.155.175):
iptables -t nat -A PREROUTING -p tcp -s 172.18.0.0/24 --dport 4460 -m tcp -d 104.131.155.175 -j REDIRECT --to 8080
mitmproxy ログを確認しましょう:
mitmproxy ログ
docker ログを確認しましょう:
docker ログ
MIT