OpenSSH 9.8p1 がリリースされました

2024/07/01, OpenSSH 9.8p1 がリリースされました.

セキュリティ問題の修正が 2 つあり, 1 つは致命的なものです.

その他で重要と思える変更点は次です.

  • 署名アルゴリズム DSA のサポートがコンパイル時にデフォルトで無効になります
  • これまでの sshd バイナリが リスナーのバイナリ sshd とセッションごとのバイナリ sshd-session に分離されます
    • 一部のログメッセージに変更があります
  • (fail2ban のようなサードパーティのソフトウェアを利用せずに) sshd に認証までの段階で攻撃が疑われるクライアントアドレスからの接続をブロックする機能が追加されます
    • 認証失敗, 認証未完了, sshd のクラッシュ など
    • デフォルトで有効になります
https://www.openssh.com/releasenotes.html#9.8p1

Security
========

セキュリティ

This release contains fixes for two security problems, one critical
and one minor.

このリリースは 2 つのセキュリティ問題の修正を含んでいる.
1 つは致命的で 1 つはマイナーだ.

1) Race condition in sshd(8)

1) sshd(8) でのレースコンディション

A critical vulnerability in sshd(8) was present in Portable OpenSSH
versions between 8.5p1 and 9.7p1 (inclusive) that may allow arbitrary
code execution with root privileges.

8.5p1 から 9.7p1 までの移植版 OpenSSH には sshd(8) に
root 権限で任意のコード実行を許す可能性がある致命的な脆弱性が存在する. 

Successful exploitation has been demonstrated on 32-bit Linux/glibc
systems with ASLR. Under lab conditions, the attack requires on
average 6-8 hours of continuous connections up to the maximum the
server will accept. Exploitation on 64-bit systems is believed to be
possible but has not been demonstrated at this time. It's likely that
these attacks will be improved upon.

ASLR (訳注: アドレス空間配置のランダム化) がある 32-bit Linux/glibc
のシステムで攻撃が成功することが実証されている. 実験的な環境下で
この攻撃はサーバーが受け付ける最大値まで連続的な接続が平均で 6〜8時間
必要となる. 64-bit のシステムに対する攻撃も可能と思われるが,
現時点では実証されていない. これらの攻撃が改良される蓋然性は高い.

Exploitation on non-glibc systems is conceivable but has not been
examined. Systems that lack ASLR or users of downstream Linux
distributions that have modified OpenSSH to disable per-connection
ASLR re-randomisation (yes - this is a thing, no - we don't
understand why) may potentially have an easier path to exploitation.
OpenBSD is not vulnerable.

glibc でないシステムに対する攻撃も考えられるが, 実証はされていない.
ASLR を欠いていたり ダウンストリームの Linux ディストリビューションが
OpenSSH に 接続ごとの ASLR 再ランダム化を無効にする修正を加えている場合
(ありえることですがなぜかは理解できない) 攻撃がより簡単になる可能性がある.
OpenBSD は脆弱ではない.

We thank the Qualys Security Advisory Team for discovering, reporting
and demonstrating exploitability of this problem, and for providing
detailed feedback on additional mitigation measures.

この問題を発見し報告し攻撃を実証し追加の緩和策について詳細なフィードバック
を提供してくれた Qualys Security Advisory Team に感謝する.

2) Logic error in ssh(1) ObscureKeystrokeTiming

2) ssh(1) の ObscureKeystrokeTiming での論理エラー

In OpenSSH version 9.5 through 9.7 (inclusive), when connected to an
OpenSSH server version 9.5 or later, a logic error in the ssh(1)
ObscureKeystrokeTiming feature (on by default) rendered this feature
ineffective - a passive observer could still detect which network
packets contained real keystrokes when the countermeasure was active
because both fake and real keystroke packets were being sent
unconditionally.

9.5 から 9.7 までの OpenSSH のバージョンで, 9.5 以降の OpenSSH サーバー
に接続した歳 (デフォルトで有効な) ssh(1) の ObscureKeystrokeTiming 機能
の論理エラーがこの機能を効果のないものにしている.
偽のキーストロークと本物のキーストロークのパケットが無条件に送信されるため
対策が有効な場合でも本物のキーストロークを含むネットワークパケットを
受動的な監視者が検知できる.

This bug was found by Philippos Giavridis and also independently by
Jacky Wei En Kung, Daniel Hugenroth and Alastair Beresford of the
University of Cambridge Computer Lab.

このバグは Philippos Giavridis によって発見され, また独立に
University of Cambridge Computer Lab の Jacky Wei En Kung と
Daniel Hugenroth, Alastair Beresford によって発見された.

Worse, the unconditional sending of both fake and real keystroke
packets broke another long-standing timing attack mitigation. Since
OpenSSH 2.9.9 sshd(8) has sent fake keystoke echo packets for
traffic received on TTYs in echo-off mode, such as when entering a
password into su(8) or sudo(8). This bug rendered these fake
keystroke echoes ineffective and could allow a passive observer of
a SSH session to once again detect when echo was off and obtain
fairly limited timing information about keystrokes in this situation
(20ms granularity by default).

さらに悪いことに, 偽と本物のキーストークパケットを無条件に送信することで
別の長く存在するタイミング攻撃の緩和策を壊してしまっていた.
OpenSSH 2.9.9 以降の sshd(8) は, su(8) や sudo(8) でパスワードを入力
する場合のような echo-off モードの TTY で受信したトラフィックに対して
偽のキーストークエコーパケットを送信していた. このバグは
これらの偽のキーストロークエコーを効果がないものにし SSH のセッションの
監視者が echo が off であることを再び検知し この状況での
(デフォルトで 20 ms の粒度) キーストロークのかなり限定されたタイミング
情報を得ることを可能しうる.

This additional implication of the bug was identified by Jacky Wei
En Kung, Daniel Hugenroth and Alastair Beresford and we thank them
for their detailed analysis.

バグのこの追加の影響は Jacky Wei En Kung と Daniel Hugenroth, 
Alastair Beresford よって識別された. 彼らの詳細な解析に感謝する.

This bug does not affect connections when ObscureKeystrokeTiming
was disabled or sessions where no TTY was requested.

このバグは ObscureKeystrokeTiming が無効になっている接続や TTY が
要求されていないセッションには影響しない.

Future deprecation notice
=========================

将来非推奨となる機能の告知

OpenSSH plans to remove support for the DSA signature algorithm in
early 2025. This release disables DSA by default at compile time.

OpenSSH は 2025年前半に DSA 署名アルゴリズムに対するサポートを除く
ことを計画している.
このリリースでコンパイル時にデフォルトでは DSA を無効にする.

DSA, as specified in the SSHv2 protocol, is inherently weak - being
limited to a 160 bit private key and use of the SHA1 digest. Its
estimated security level is only 80 bits symmetric equivalent.

SSHv2 プロトコルで指定された DSA は 本質的に弱い - 秘密鍵が 160 bit
に制限されていて SHA1 ハッシュを用いている. 見積もられるセキュリティレベル
は共通鍵暗号の 80 bit しかない.

OpenSSH has disabled DSA keys by default since 2015 but has retained
run-time optional support for them. DSA was the only mandatory-to-
implement algorithm in the SSHv2 RFCs, mostly because alternative
algorithms were encumbered by patents when the SSHv2 protocol was
specified.

OpenSSH は 2015 年以降 DSA 鍵をデフォルトで無効にしているが, 
ランタイムでの(任意の)サポートは維持している. DSA は,
SSHv2 プロトコルが仕様化された際に代替のアルゴリズムが特許で阻まれていた
ため, SSHv2 RFC[3] 中で実装が必須の唯一のアルゴリズムだ.

This has not been the case for decades at this point and better
algorithms are well supported by all actively-maintained SSH
implementations. We do not consider the costs of maintaining DSA in
OpenSSH to be justified and hope that removing it from OpenSSH can
accelerate its wider deprecation in supporting cryptography
libraries.

現時点では何十年もこのような(特許による障害がある)場合は起こっておらず, 
すべての活発に維持されている SSH の実装でよりよいアルゴリズムが
十分にサポートされている. 我々は OpenSSH で DSA を維持するコストが
正当化されるとは考えておらず, OpenSSH から DSA を除くことが
(DSAを) サポートしている暗号ライブラリでのより広い DSA の非推奨への加速
を期待している.

This release, and its deactivation of DSA by default at compile-time,
marks the second step in our timeline to finally deprecate DSA. The
final step of removing DSA support entirely is planned for the first
OpenSSH release of 2025.

このリリースと コンパイル時のデフォルトでの DSA の非活性化により
最終的に DSA を無効にする我々のタイムラインでの 2 番目のステップを記録する.
DSA のサポートを完全に除去する最後のステップは
2025 年の 最初の OpenSSH のリリースで予定している.

DSA support may be re-enabled in OpenBSD by setting "DSAKEY=yes"
in Makefile.inc. To enable DSA support in portable OpenSSH, pass
the "--enable-dsa-keys" option to configure.

DSA のサポートは OpenBSD では Makefile.inc で "DSAKEY=yes" と
設定することで再有効化できる. 移植版 OpenSSH で DSA サポートを
有効にするには configure に "--enable-dsa-keys" を渡す.

Potentially-incompatible changes
--------------------------------

潜在的に非互換な変更

 * all: as mentioned above, the DSA signature algorithm is now
   disabled at compile time.

   all: 前述したように 今後 DSA 署名アルゴリズムはコンパイル時に
   無効となる

 * sshd(8): the server will now block client addresses that
   repeatedly fail authentication, repeatedly connect without ever
   completing authentication or that crash the server. See the
   discussion of PerSourcePenalties below for more information.
   Operators of servers that accept connections from many users, or
   servers that accept connections from addresses behind NAT or
   proxies may need to consider these settings.

   sshd(8): 今後サーバーは認証の失敗の繰り返したり, 認証を完了しない
   接続を繰り返したり, サーバーをクラッシュさせるクライアントのアドレスを
   ブロックする. 後述の PerSourcePenalties の議論にさらなる情報があるので
   参照. 多くのユーザーからの接続を受けつけたるサーバーや NAT やプロキシの背後
   のアドレスからの接続を受け付けるサーバーの運用者はこれらの設定を
   考察する必要があるかもしれない.

 * sshd(8): the server has been split into a listener binary, sshd(8),
   and a per-session binary "sshd-session". This allows for a much
   smaller listener binary, as it no longer needs to support the SSH
   protocol. As part of this work, support for disabling privilege
   separation (which previously required code changes to disable) and
   disabling re-execution of sshd(8) has been removed. Further
   separation of sshd-session into additional, minimal binaries is
   planned for the future.

   sshd(8): サーバーはリスナーのバイナリ sshd(8) と セッションごとのバイナリ
   "sshd-session" に分割される. これによりリスナーバイナリのサイズが
   とても小さくできる. SSH プロトコルをサポートする必要がなくなるからだ.
   この作業の一部として, 特権分離の無効化 (以前は無効にするのに
   コードの変更が必要だった) と sshd(8) の再実行の無効化のサポートが
   削除される. sshd-session をさらに最小(機能)単位のバイナリ群に分離していくことが
   将来計画されている.

 * sshd(8): several log messages have changed. In particular, some
   log messages will be tagged with as originating from a process
   named "sshd-session" rather than "sshd".

   sshd(8): いくつかのログメッセージが変更される. 特に いくつかのログ
   メッセージが "sshd" ではなく "sshd-session" という名前のプロセスから
   発生したものとしてタグ付けられる.

 * ssh-keyscan(1): this tool previously emitted comment lines
   containing the hostname and SSH protocol banner to standard error.
   This release now emits them to standard output, but adds a new
   "-q" flag to silence them altogether.

   ssh-keyscan(1): このツールは以前ホスト名ほ含むコメント行と
   SSH プロトコルバナーを標準エラーに出力していた. このリリースでは
   それらを標準出力に出力するようになり, 新しい "-q" フラグを追加して
   それらを完全に沈黙させられる.

 * sshd(8): (portable OpenSSH only) sshd will no longer use argv[0]
   as the PAM service name. A new "PAMServiceName" sshd_config(5)
   directive allows selecting the service name at runtime. This
   defaults to "sshd". bz2101

   sshd(8): (移植版 OpenSSH のみ) sshd は今後 PAM のサービス名として
   argv[0] を利用しない. 新しい "PAMServiceName" sshd_config(5)
   設定項目で, 実行時にサービス名を選択できるようになる. このデフォルトは
   "sshd" だ. bz2101

 * (portable OpenSSH only) Automatically-generated files, such as
   configure, config.h.in, etc will now be checked in to the portable
   OpenSSH git release branch (e.g. V_9_8). This should ensure that
   the contents of the signed release branch exactly match the
   contents of the signed release tarball.

   (移植版 OpenSSH のみ) configure や config.h.in のような自動的に生成される
   ファイルは, 移植版 OpenSSH の git リリースブランチ (例えば V_9_8) に
   チェックインされるようになる. これにより署名されたリリースブランチの内容が
   署名されたリリース tarball の内容に完全に一致することが保証される.

Changes since OpenSSH 9.7
=========================

OpenSSH 9.7 からの変更点

This release contains mostly bugfixes.

このリリースは主としてバグ修正を含んでいる.

New features
------------

新機能

 * sshd(8): as described above, sshd(8) will now penalise client
   addresses that, for various reasons, do not successfully complete
   authentication. This feature is controlled by a new sshd_config(5)
   PerSourcePenalties option and is on by default.

   sshd(8): 前述のように sshd(8) は  いろいろな理由で認証を成功で完了しない
   クライアントのアドレスを罰する機能を追加する. 
   この機能は 新しい sshd_config(5) の PerSourcePenalties 設定項目で制御され
   デフォルトで有効だ.

   sshd(8) will now identify situations where the session did not
   authenticate as expected. These conditions include when the client
   repeatedly attempted authentication unsucessfully (possibly
   indicating an attack against one or more accounts, e.g. password
   guessing), or when client behaviour caused sshd to crash (possibly
   indicating attempts to exploit bugs in sshd).

   sshd(8) はこの状況には, クライアントは繰り返し不成功となる
   認証を繰り返し試行した場合 (パスワードの推測など, 1つ以上のアカウントに
   対しての攻撃を示唆している可能性がある) や sshd をクラッシュさせる
   クライアントの振舞い (sshd 内のバグを悪用する試みを示唆している可能性がある) が
   含まれる.

   When such a condition is observed, sshd will record a penalty of
   some duration (e.g. 30 seconds) against the client's address. If
   this time is above a minimum configurable threshold, then all
   connections from the client address will be refused (along with any
   others in the same PerSourceNetBlockSize CIDR range) until the
   penalty expire.

   これらの状況が観測されると, sshd はクライアントアドレスに対して
   それなりの時間 (例えば 30 秒) の罰を記録する. この時間が
   設定できる閾値の最小値を越えている場合, 罰が免除されるまで
   クライアントアドレスからの すべての接続が拒否される 
   (同じ PerSourceNetBlockSize CIDR の範囲の他の接続も同様).

   訳注: デフォルトでは範囲ではなくアドレス単体

   Repeated offenses by the same client address will accrue greater
   penalties, up to a configurable maximum. Address ranges may be
   fully exempted from penalties, e.g. to guarantee access from a set
   of trusted management addresses, using the new sshd_config(5)
   PerSourcePenaltyExemptList option.


   同じクライアントアドレスから違反が繰替えされると より大きな罰が, 
   設定可能な最大値まで, 発生する. 例えば 信頼された管理アドレスの
   集合からのアクセスを完全に免除するなら, 新しい sshd_config(5) の 
   PerSourcePenaltyExemptList 設定項目を用いることができる.

   訳注: 状況ごとに記録される罰, 拒否にいたる閾値, 拒否の最大値などは
   PerSourcePenalties 設定項目で設定できる.

   We hope these options will make it significantly more difficult for
   attackers to find accounts with weak/guessable passwords or exploit
   bugs in sshd(8) itself. This option is enabled by default.

   これらの設定により攻撃者が 弱い/推測可能なパスワードを持つアカウントの検索や
   sshd(8) 自体のバグの悪用をするのをかなり難しくできると期待している.
   このオプションはデフォルトで有効だ.

 * ssh(8): allow the HostkeyAlgorithms directive to disable the
   implicit fallback from certificate host key to plain host keys.

   ssh(8): HostkeyAlgorithms 設定項目で証明書ホスト鍵から
   プレーンなホスト鍵への暗黙のフォールバックを無効にできるようにする.

Bugfixes
--------

バグ修正

 * misc: fix a number of inaccuracies in the PROTOCOL.*
   documentation files. GHPR430 GHPR487

   misc: PROTOCOL.* 文書中の多数の不正確な記述を修正する.
   GHPR430 GHPR487

 * all: switch to strtonum(3) for more robust integer parsing in most
   places.

   all: ほとんどの場所でより堅牢な整数パースをするのに strtonum(3)
   に移行する.

 * ssh(1), sshd(8): correctly restore sigprocmask around ppoll()

   ssh(1), sshd(8): ppoll() 回りで正しく sigprocmask を回復する

 * ssh-keysign(8): stricter validation of messaging socket fd GHPR492

   ssh-keysign(8): メッセージソケットファイルデスクリプタをより厳格に
   検証 GHPR492

 * sftp(1): flush stdout after writing "sftp>" prompt when not using
   editline. GHPR480

   sftp(1): editline を利用していない場合に "sftp>" プロンプトを
   出力した後で stdout を flush する. GHPR480

 * sftp-server(8): fix home-directory extension implementation, it
   previously always returned the current user's home directory
   contrary to the spec. GHPR477

   sftp-server(8): home-directory 拡張実装を修正する. 以前は仕様に反して
   常に現在のユーザーのホームディレクトリに帰っていた. GHPR477

 * ssh-keyscan(1): do not close stdin to prevent error messages when
   stdin is read multiple times. E.g.
   echo localhost | ssh-keyscan -f - -f -

   ssh-keyscan(1): 標準入力が複数回読まれた場合のエラーメッセージを
   防ぐため標準入力を閉じないようにする.
   例えば: echo localhost | ssh-keyscan -f - -f -

 * regression tests: fix rekey test that was testing the same KEX
   algorithm repeatedly instead of testing all of them. bz3692

   regression tests: rekey のテストを修正. 以前は 同じ鍵交換アルゴリズム
   で繰り返しテストしていたが, すべてのアルゴリズムを利用するように.

 * ssh_config(5), sshd_config(5): clarify the KEXAlgorithms directive
   documentation, especially around what is supported vs available.
   bz3701.

   ssh_config(5), sshd_config(5): KEXAlgorithms 設定項目の文書を,
   特に何をサポートしている/利用可能かについて, 明瞭にする.
   bz3701.

Portability
-----------

移植性

 * sshd(8): expose SSH_AUTH_INFO_0 always to PAM auth modules
   unconditionally. The previous behaviour was to expose it only when
   particular authentication methods were in use.

   sshd(8): SSH_AUTH_INFO_0 をPAM 認証モジュールに無条件で露出する.
   以前の動作では特定の認証法が利用される場合のみ露出していた.

 * build: fix OpenSSL ED25519 support detection. An incorrect function
   signature in configure.ac previously prevented enabling the recently
   added support for ED25519 private keys in PEM PKCS8 format.

   build: OpenSSL の ED25519 サポート検出を修正する. 以前の
   configure.ac 中の不正な署名関数の呼び出しでは PEM PKCS8 形式の
   ED25519 秘密鍵に対する最近追加されたサポートを有効にできていなかった.

 * ssh(1), ssh-agent(8): allow the presence of the WAYLAND_DISPLAY
   environment variable to enable SSH_ASKPASS, similarly to the X11
   DISPLAY environment variable. GHPR479

   ssh(1), ssh-agent(8): WAYLAND_DISPLAY 環境変数が存在する場合,
   X11 の DISPLAY 環境変数と 同様に SSH_ASKPASS を有効にする. GHPR479

 * build: improve detection of the -fzero-call-used-regs compiler
   flag. bz3673.

   build: -fzero-call-used-regs コンパイラーフラグの検出を改善する.
   bz3673.

 * build: relax OpenSSL version check to accept all OpenSSL 3.x
   versions.

   build: すべての OpenSSL 3.x バージョンを受け入れるように OpenSSL
   のバージョンチェックを緩和する.

 * sshd(8): add support for notifying systemd on server listen and
   reload, using a standalone implementation that doesn't depend on
   libsystemd. bz2641

   sshd(8): libsystemd に依存しないスタンドアローンの実装を用いて
   サーバーの listen と reload 時での systemd への通知のサポートを追加する.
   bz2641