macOS High Sierraのrootログイン脆弱性

2017/11/30更新:セキュリティアップデートがリリースされました。

このアップデートを当てると、rootユーザを有効にした状態でも強制的に無効にされます。また、改めてrootユーザを有効にしようとすると、新しいパスワードを求められます。

このため本記事に記載した、「パスワードが空のrootユーザ」がいる状態の問題も、自動的に解決されます。

                                                                                                • -

本日話題になった、いとも簡単にmacOS High Sierraでrootが取れるという件について、色々落とし穴が多いのでまとめてみました。

対象

High Sierra 10.13.1(2017/11/29現在の最新)

予備知識

通常、High Sierraではrootユーザは無効となっています。これは次のように、「ディレクトリユーティリティ」を使うと「ルートユーザを有効にする」という選択ができることからも分かります。

ただしこの場合でも、sudo suコマンドを使うことで、現ログインユーザのパスワードを知っている者はrootでシェルを取ることができます。

このためmacで言う「ルートユーザが無効」とは、「rootでログインは、”普通は"できない」くらいに捉えておくとよいでしょう。psコマンドでも、rootユーザ権限で動いているプロセスは大量にあることが確認できます。

脆弱性の作用について

再現手順については、各所に報告されていることからここでは解説しません。実際に脆弱性を利用すると、次のように「ディレクトリユーティリティ」で「ルートユーザを無効にする」という選択肢が出ていることから、ルートユーザが有効となったことが分かります。

この際注意しないといけないのは、同時にルートユーザのパスワードが空っぽ(空文字列)になるということです。このため、いったんログアウトして「その他のユーザ」から、ユーザ名を「root」、パスワードを空にするとGUIでログインできます。

rootでログインした様子がこちらです。

当然のことながらrootユーザですから、この状態でシステム権限を完全に掌握したことになります。

なおこの際、コンソール(loginコマンド)やsshでは空文字列でログインできませんでした。


この部分は何か別の制御がされているようです。(sshは、デフォルトではPermitRootLoginはprohibit-passwordですしね)

事後対応

攻撃を受けた場合のみならず、遊び半分でこの脆弱性を試した際も十分注意しないといけないのは、本脆弱性が発動した後は「rootユーザが有効化されており、そのパスワードが空文字列である」ということです。そこで対策として、rootユーザにパスワードを設定しなくてはいけません。なお後述しますが、rootユーザの無効化は不要です。

rootユーザのパスワードの変更は、一般ユーザが、ターミナルよりsudoでpasswdコマンドを実行することで可能です。

sudoですので、はじめに現ユーザのパスワード、続いてrootユーザの新規パスワードを2回入力します。ここでは、十分に長く複雑なパスワードを付与しましょう。

これにより、既知の攻撃手法を用いても、既にrootにはパスワードが付加されているため、rootユーザのパスワードを知らないと攻撃ができません。

また、当然のことながらログイン画面からのrootによるGUIログインも不可となります。

なお注意しないといけないのは、最後に「やれやれ」とrootユーザの無効化をしてはいけないということです。(実は今日やってしまい、会社の先輩からそれはダメだと教えてもらいました)。
rootユーザを「ディレクトリユーティリティ」から再び無効化してしまうと、たとえrootにパスワードを設定していても本脆弱性は発動し、再び「パスワードが空文字列のrootユーザ」の状態へと戻ってしまいます。

そのため、rootユーザは現時点では有効化しておく方が安全です。

対策

現状、Appleからパッチがリリースされていないため、予備的対策としてできることを挙げます。

  • rootユーザを有効化し、長いパスワードを付加しておく
  • 離席など目を離す際は、必ずスクリーンロックをかける

なお本脆弱性は物理的に端末を触れることができる状態で、ログイン後の画面を操作できるときしか実行できませんから、スクリーンロックをかけるだけでも十分な対策となります(たぶん)。ただし、「共有」設定で「画面共有」をOnにしていると操作ができてしまいますから、こちらはOffにしておきましょう。