ふるつき

v(*'='*)v かに

2023年に読み始めて面白かったWeb小説

kotatsugame リスペクトです。2022年版もある

furutsuki.hatenablog.com

途中までしか読んでなくても、その途中までが面白かったら載せています。2022年に読み始めてても↑に書き忘れてたら書いてるかも

こうして見返すと新規に読み始めているのハーメルンばかりですね

Terrapin-Attack メモ

qiita.com

の記事とコメントのほうが詳しく解説してた


ちょっと興味があって、先日公開されたSSHのIntegrityを破る攻撃であるところのTerrapin-Attack (https://terrapin-attack.com) について調べて社内勉強会で発表したりしていました。せっかくなので日本語のメモを残しておきます。

概要

中間者がパケットをDROPできるというのが攻撃。サーバ・クライアントはそのパケットがDROPされたことに気が付けないので、Integrityが破られたということになる。1つパケットをDROPするので辻褄合わせのために1つ偽造しておくことになる。

原理

前提: サーバ・クライアントはメッセージ番号のカウンタを持っていて、MACの計算に使われたりする

これは論文の図がわかりやすいと思う。サーバ・クライアントはそれぞれ今いくつメッセージを送っていて、いくつのメッセージを受け取っているかをカウンタとして持っている*1。論文中ではそれぞれSnd, Rcvという名前になっていて、基本的にはサーバのSnd = クライアントRcvで逆も然り。

暗号方式によっては、このカウンタがMACの計算に使われる*2。Terrapin-Attackでは、このカウンタの値をサーバ・クライアント間でずらしておくことで、一個メッセージをDROPしたときにSnd, Rcvの値がずれないようにする=MACの計算が正常に行われるようにすることで、メッセージのDROPに気が付かせない

攻撃: IGNOREパケットを偽造する

攻撃者はSecure Connectionの確立前(=鍵共有の完了前)にIGNOREパケット*3を偽造する。図ではクライアントに対して送り付けているけど逆でもよくて、どのパケットをDROPしたいかによる。

Secure Connectionの確立前なので通信はTCP平文で行われていて、中間者がパケットの盗聴・偽造が可能。これにより、サーバのSndに対してクライアントのRcvが1多い状態になる。

攻撃: パケットをDROPする

攻撃者はSecure Connectionの確立後の最初のパケットをDROPする。図ではサーバ→クライアントのパケットをDROPしている。これにより、クライアントのRcvは上がらないがサーバのSndが1上がる。先にIGNOREパケットを偽造しておいたお陰で、ここでサーバのSndとクライアントのRcvの値が揃う。

普通はパケットが1つ消えると、次のパケットの送信でSnd, Rcvの値がずれてMACの検証に失敗して気がつけるが、次のパケットのMACの検証は成功するのでサーバ・クライアントはパケットの消失に気がつけず、攻撃が成立した。

脅威

で、Secure Connection の確立後のパケットがDROPできるのがどれだけ脅威なのか。論文によると、Secure Connection確立後の最初のパケットはEXT_INFOってやつでSSHの拡張プロトコル的なやつらしい。これでkeystroke timing countermeasureみたいなセキュア機能を有効にするんだが、それを阻止できる(クライアントからみると、サーバはEXT_INFOを送ってこないので拡張プロトコルに対応してないんだなと思わせられる)。

したがって他の攻撃を通しやすくなる、ということっぽい

対策

OpenSSH 9.6にはこの攻撃への対策が導入されている。strict KEXと命名された。

SSHハンドシェイクの最初のパケットであるKEX_INITパケットには、そのサーバ/クライアントが対応する暗号方式がalgorithm_listとして含まれるが、algorithm_listにstrictモード用の識別子 kex-strict-c-v00@openssh.com / kex-strict-s-v00@openssh.com が追加される。これは暗号方式ではなく、自分がこれを送っていて相手がこれを送ってきたらstrict KEXをやりますという値。

strict KEXに入ると、SSHハンドシェイク中のIGNOREパケットとDEBUGパケットは無視されるようになり、このパケットを受け取ってもRcvカウンタがインクリメントされなくなる。

まとめ

……という話をしたら、じゃあKEX_INITを改竄すればいいじゃんという指摘をもらって、たしかにと思ったけど、KEX_INITの値はこのあとのKEX_DHREPLYで計算されるハッシュに利用されるので改竄されると気が付かれるようだった。逆にIGNOREはそういうハッシュに含まれないので気がつけない。このあたりTLSはTranscript Hashなるやつを採用していて対策できていると論文にあった気がするので、次はそのあたりが気になる*4

なんにせよこういう面白い話を知れるのは楽しいですね

*1:SSHは双方向にメッセージを送りあうのでSnd, Rcvの2つが必要

*2:逆にこのカウンタをMACに使わない方式ではこの攻撃は成立しない

*3:https://tex2e.github.io/rfc-translater/html/rfc4253.html#11-2--Ignored-Data-Message

*4:このあたりは関係ない話を繋げている気がするので相当自信ない

telescope.nvimのfzf extensionを使いつつfzfはrgバックエンドにしてるんだけどなんかfind_filesで.github以下が見つからなくてworkflowファイルの編集のときだけ毎回:tabnewしている人向けのtips

~/.rgignore!.github/ って書いておいたら良い。ということが https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#automatic-filtering に書いてあります。

タイトルのtelescopeとかfzfとかはミスリーディング