構成プロファイルの削除コントロールといまさらながらixintpwn(YJSNPI)の削除方法の没ネタ


概要

iOSの構成プロファイルは、設定を適用するための設定ファイルである。
一括して設定する場合、勝手に削除されると不都合がある場合(MDMを使わない程度に小規模な企業とか)を想定しているものと思われるが、構成プロファイルの削除をコントロールする設定を行うことができる。

どんな設定か

プロファイル削除ポリシー

設定値 内容
常に プロファイル詳細画面に「プロファイルを削除」のボタンが表示される。iOSの利用者が削除することができる。不特定多数に配布されるもの(APNやWi-Fi、キャリアメールなど)は基本これ。
認証時 「プロファイルを削除」のボタンが表示されるが、プロファイルごとに設定されるパスワードを入力しなければ削除できない。パスワードはプロファイルを暗号化しないと、平文でプロファイル内に記述される。管理者が一括設定する際に「何かあったときにすぐに消せるようにしておこう」程度の考えで利用するものと考えるといいかもしれない
取り除かない 「プロファイルを削除」のボタンが非表示になり、消しづらくなる。絶対に消せないわけではない。YJSNPIに使われている。

※一部の設定値を持つプロファイルは、「常に」以外を許容しないが、特殊なものなのであまり気にしない。
※リファレンス上だと「Supervised only.」とありますが、少なくともiOS10までは監視モードでなくても効きます。iOS11では追々気が向いたら試してみて更新します。
※→効きました。でもiOS11からは「取り除かない」である場合、インストール前とインストール時に警告が出るようになったようです。

プロファイル自動削除ポリシー

設定値 内容
自動削除しない そのまんま。基本これ。
指定日 日付を指定し、その日になると自動削除される。基本的に指定した日以降でロックを解除した状態の場合に消えるが、たまにiOSの気分次第っぽい挙動をする時がある。
一定期間後 プロファイルのインストールが完了してから指定した秒数が経過すると消える。とある場所で(毎日キーが変わる)ゲスト用Wi-Fi設定に稀に使われているのを見たことがある。初期設定をする時に作業用で使うWebクリップやWi-Fi設定を突っ込んでおく場合に、消し忘れ対策で使える。逆に急に消えて焦るのはご愛嬌。

iXintpwn(通称 YJSNPIウイルス)とは

少し前(2016年中ごろ)からちょいと耳にして、最近(2017年09月末)からやたらと騒がれているブツ。
トレンドマイクロのセキュリティブログで解説されたのを皮切りに、いくつかのネットニュースでも解説されている。

実態はウイルスではなく、以下の設定値を持つ構成プロファイルである。

  • 削除ポリシーが「取り除けない」
  • 自動削除ポリシーはもちろん「自動削除しない」
  • 内容はWebクリップの設定
    • 但し、数がものすごく多い。某メール利用設定がかわいく見えるぐらい。(見つけた奴で166個)
    • さらに、Webクリップにも削除禁止設定が入っているので、ホーム画面からアイコンの手動削除ができない。

ジョークソフトの類ではあるが、iOSが(おそらく)ここまで大量のWebクリップを想定していないので、このクリップ追加時にOSが不安定になることがある。
そして、先に記載した通り、削除不可フラグが立っているので簡単に消すことができない。

消し方とプロファイル識別子

Macがあれば、Apple Configurator 2を使って消す。または初期化すれば消えると書いてあるところもある。
他の手段として、既に作っている人がいるが、「同一の識別子を持つ、削除可能な構成プロファイル」で上書きしてやるのが手っ取り早い。

プロファイル識別子とは、プロファイルを特定する文字列であり、これが同一のもの同士は基本的に上書きしあう。

識別子は、上記セキュリティブログのスクリーンショットで「com.yjsnpi.virus.wit6m6sr」のほか、ネット上では「com.yjsnpi.virus」や「com.yjsnpi.virusxs」も転がっているようである。

追記
ブログを適当に斜め読みして見落としていたが、オリジナルは識別子を都度生成との事。Appleさん、cfgutilだけでもいいからWindows版を出してください。

とりあえず、落としたブツが判明しているならば、テキストエディタで開いて「PayloadIdentifier」を開いてやれば判るが、それはさておき以下のような感じ。

ixintpwn_vaccine.mobileconfig
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- インストール時に表示される注意事項です -->
    <key>ConsentText</key>
    <dict>
        <key>default</key>
        <string>本プロファイルを利用することにより、何らかの損害が発生しても、本プロファイルの製作者は一切の責任を負いません。
本プロファイルは署名されていますが、この署名は本プロファイルの正当性を含む一切を保証するものではありません。</string>
    </dict>
    <!-- ここまで注意事項 -->
    <!-- 自動削除の設定です。ここで指定した秒数を経過するとプロファイルが消えます。 -->
    <key>DurationUntilRemoval</key>
    <integer>10</integer>
    <!-- とりあえず10秒に設定しています -->
    <key>HasRemovalPasscode</key>
    <false/>
    <key>PayloadContent</key>
    <array>
        <!-- ここからは、何かしら設定を入れないと無効な構成プロファイルとなってしまうので、ダミーの設定として適当なWi-Fi接続設定を入れている。 -->
        <dict>
            <key>AutoJoin</key>
            <false/>
            <key>CaptiveBypass</key>
            <false/>
            <key>EncryptionType</key>
            <string>None</string>
            <key>HIDDEN_NETWORK</key>
            <false/>
            <key>IsHotspot</key>
            <false/>
            <key>PayloadDescription</key>
            <string>Wi-Fi 設定を構成します</string>
            <key>PayloadDisplayName</key>
            <string>Wi-Fi</string>
            <key>PayloadIdentifier</key>
            <string>com.apple.wifi.managed.3BEFFCAC-22E7-4CAF-A721-1E9D76CF5771</string>
            <key>PayloadType</key>
            <string>com.apple.wifi.managed</string>
            <key>PayloadUUID</key>
            <string>3BEFFCAC-22E7-4CAF-A721-1E9D76CF5771</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ProxyType</key>
            <string>None</string>
            <key>SSID_STR</key>
            <string>DUMMY</string>
        </dict>
        <!-- ここまでWi-Fi設定 -->
    </array>
    <!-- ここからプロファイルの説明が入ります。 -->
    <key>PayloadDescription</key>
    <string>ixintpown(通称YJSNPI)を削除します。
対応する識別子は「com.yjsnpi.virus」です。
このプロファイルにはダミーのWiFi接続設定が含まれます。(SSID:DUMMY)
インストール後、一時間が経過すると自動的に削除される設定です。</string>
    <!-- ここまでプロファイル説明 -->
    <key>PayloadDisplayName</key>
    <string>YJSNPI削除用</string>
    <!-- ここがプロファイル識別子です -->
    <key>PayloadIdentifier</key>
    <string>com.yjsnpi.virus</string>
    <!-- ここが同じであれば、同一のプロファイルとして扱われ上書きされます。 -->
    <key>PayloadOrganization</key>
    <string>iosprofiles.i.open.ad.jp</string>
    <!-- ここからプロファイルの削除ポリシーです。 -->
    <key>PayloadRemovalDisallowed</key>
    <false/>
    <!-- 値が「true」の場合、「取り除かない」(iOS上で削除不可)となります。
    リファレンス上だと「Supervised only.」とありますが、少なくともiOS10までは監視モードでなくても効きます。
    iOS11では追々気が向いたら試してみて更新します。-->
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>A2BC0702-449C-4E82-9864-7881FC09D7A8</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
</dict>
</plist>

プロファイルの署名について

こちらの記事で、構成プロファイルの署名について記載しているが、プロファイルの署名はあくまでも発行者と署名された以降に不正に改ざんされていないことを示すのみである。
なので、署名がされていたとしてもそれが本当に安全なものかどうかは別の話。
やろうと思えば、YJSNPIにきちんと署名してしまうことも可能ではある。
なので、未署名なので特に気を付けるのではなく、信頼できないところから手に入れたプロファイルを使うときに気を付けた方がいいかもしれない。

サンプルで「検証済み」と出るように署名したものを最下部に置いています。
中身は上で書いたものに、少し説明を追記した程度のもので、設定される内容は同じです。

別記事にも書いてありますが、署名されているプロファイルは、その証明書が信頼されるものかどうかに関係なく、容易に上書きすることはできません。
もし、今回のような悪意のあるプロファイルが署名されていた場合、対応は本当に面倒くさくなります。同一の証明書で署名されていないと上書きすることができず、仮に不正なプロファイルが署名されていたものであった場合は、現実的に上書きすることは不可能と考えた方が良いでしょう。

なお、個人的な体感として、国内で一般公開されているプロファイルは署名されていないものの方が多い気がする。
某社のTwitterの中の人によると、プロファイルにきちんと署名をつけるのは面倒であるとの事。
実際、上記の記事に手順は書いたが、本当にそれがApple的に正しいやり方である訳ではない。リファレンスに沿った実装ではあるが、いきなり使えなくなる可能性もある。
他にも制限や費用や運用の問題もあるので、難しい話である。

きちんとしたコードサイニング証明書をキーチェインに突っ込んでやればConfiguratorで署名できるらしいが、自己満足のためだけに、きちんとしたコードサイニング証明書を取るのが面倒くさい。

おまけ

上のプロファイル(未署名版)
上のプロファイル(署名版) ※署名の有効期限は2017/12/30