OpenSSH にはキー入力のダミーデータを送信する機能がある

21
いわもと こういち @ttdoda

FreeBSD使いなTera Termの中の人…っていうかただの端末エミュレータマニア。立派なターミナリアンを目指して日夜修行に励んでいます。 最近はあまりFreeBSDを使ってません。 眼鏡好き。 なるようになれ、明日もイケイケ♪

srad.jp/~doda/journal/

いわもと こういち @ttdoda

最近のOpenSSH、キー入力時にチャフをばら撒いてるって話をしとかないとなあ。

2023-12-08 05:15:08

keystroke timing obfuscation (キー入力タイミングの難読化)

OpenSSH 9.5 の新機能

https://www.openssh.com/txt/release-9.5

 * ssh(1): add keystroke timing obfuscation to the client. This attempts
   to hide inter-keystroke timings by sending interactive traffic at
   fixed intervals (default: every 20ms) when there is only a small
   amount of data being sent. It also sends fake "chaff" keystrokes for
   a random interval after the last real keystroke. These are
   controlled by a new ssh_config ObscureKeystrokeTiming keyword.

解説

いわもと こういち @ttdoda

OpenSSH 9.5で実装されたキー入力タイミングの難読化について日本語で解説しているのを見かけないように思うので書いてみます。

2023-12-14 03:32:53
いわもと こういち @ttdoda

SSH通信では送受信するデータが暗号化されます。これによって盗聴されても通信内容が守られますが、すべての情報が守られる訳ではありません。極端な例ですが、サーバーに対してなんらかの通信を行っているという事は盗聴者に分かってしまいます。

2023-12-14 03:32:53
いわもと こういち @ttdoda

もう少し具体的に書くと、サーバーとの間で、いつ、どれくらいのサイズのデータが送信または受信されたかと言う事を盗聴者は知る事が出来ます。また状況によってはデータが送られなかったという事も重要な情報になり得ます。

2023-12-14 03:32:54
いわもと こういち @ttdoda

ここで、SSHでシェルセッションを開いている状況を考えます。 シェルのプロンプトで1文字入力した時、その1文字がサーバーに送られます。サーバー側はそれを受け、入力された一文字をエコーバックします。 この時、外からはサーバーとクライアントがごく短いデータを交互に送っているように見えます。

2023-12-14 03:32:55
いわもと こういち @ttdoda

次にsuやsudo等を使ってパスワードを入力する場合を考えます。この場合、クライアントからは一文字毎にデータが送られますが、サーバー側は通常ではエコーバックされません。 この時、外からはクライアントが短いデータを続けて送り、サーバーからのデータは無いように見えます。

2023-12-14 03:32:56
いわもと こういち @ttdoda

このようにパスワード入力時の挙動が違う為、現在パスワード入力中だという事が盗聴者に分かってしまいます。

2023-12-14 03:32:57
いわもと こういち @ttdoda

キー入力をした時、通常はその文字は即座に送られます。これはキー入力したタイミングが盗聴者にも分かるという事です。 キーボードでの入力で、qzのように同じ指で入力する組み合わせよりもlsのように違う手の指での組み合わせの方が入力し易く、キー入力の間隔が短くなる傾向があります。

2023-12-14 03:32:57
いわもと こういち @ttdoda

他にも、数字キーは他に比べて離れているのでアルファベットの後の数字の入力は少し遅くなる事が考えられます。 これを利用し、盗聴者がパスワード入力の間隔を調べる事によってある文字の次にくる文字の候補を絞り込めます。

2023-12-14 03:32:58
いわもと こういち @ttdoda

このようにしてパスワード入力の間隔を調べる事によってパスワードを推測するという手法が今から12年程前に発表されました。 usenix.org/conference/10t…

2023-12-14 03:32:59
いわもと こういち @ttdoda

これに対するOpenSSHの対応ですが、一つ目のパスワード入力時だと分かってしまう事に対しては、ttyの状態を確認してパスワード入力中だと思われる時はダミーのパケットを返すようになりました。しかし、さらに別のサーバーにssh接続しているような時はttyの状態が分からない為対策が使われません。

2023-12-14 03:33:00
いわもと こういち @ttdoda

二つ目のキー入力のタイミングが分かる事に対しては特に対処は行われなかったのですが、12年経った今年の10月に出たOpenSSH 9.5にて"add keystroke timing obfuscation to the client."として対処が行われました。 openssh.com/txt/release-9.5

2023-12-14 03:33:00
いわもと こういち @ttdoda

この機能が有効になると、キー入力等の少ないデータの送信は固定された間隔(デフォルトでは20ミリ秒)に合わせたタイミングで送信されるようになります。また送るデータが無い場合はチャフパケットと呼ばれるダミーのパケットが送られます。

2023-12-14 03:33:01
いわもと こういち @ttdoda

例えば l を打った105ミリ秒後に s を打った場合 0ms: l 20ms: チャフ 40ms: チャフ 60ms: チャフ 80ms: チャフ 100ms: チャフ 120ms: s 140ms: チャフ 160ms: チャフ ... というような感じで送られます。このようにチャフの中に実データ紛れ込ませる事によって入力間隔を外からは分からなくします。

2023-12-14 03:33:02
いわもと こういち @ttdoda

チャフパケットは常に送られ続けるわけではなく、最後のキー入力のある程度(数はランダムに決まる)チャフを送ったら止まり、新しいキー入力が有ると再開するというような動作になります。

2023-12-14 03:33:03
いわもと こういち @ttdoda

この機能は同じく9.5で追加された ping 拡張機能を利用する為、クライアントとサーバーが共に ping 拡張機能に対応していないと使われません。現状ではクライアント、サーバー共にOpenSSH 9.5である必要が有ります。条件を満たした場合は特に設定しなくてもデフォルトで有効になります。

2023-12-14 03:33:03
いわもと こういち @ttdoda

という事で、この機能に興味を持ったならば、OpenSSH 9.5にバージョンアップしてみてはどうでしょうか。

2023-12-14 03:33:04