macOS 10.13.3までのHigh Sierraに誤った記述のplist設定ファイルを読み込むとファイル自体が削除されてしまうバグが発見される。

スポンサーリンク

 macOS 10.13.3までのHigh Sierraに誤った記述のplist設定ファイルを読み込むとファイル自体が削除されてしまうバグが発見され、開発者らが注意を促しています。詳細は以下から。

Xcodeのアイコン

 macOSにはアプリやシステムのユーザー設定などを記述したXML形式のプロパティリスト(以下、plist)を読み書きするためのdefaultsコマンドが存在しますが、macOS 10.13 High Sierraには、このdefaultsコマンドなどで誤った記述があるplistを読み込むとファイル自体が削除されてしまうバグが発見され、開発者らが注意を促しています。

Summary:
If a plist is invalid (missing a closing tag for example) attempting to read the plist with `defaults read /path/to/plist` deletes the entire file.

Steps to Reproduce:

  1. Create a plist `defaults write /Users/Shared/test test -string test
  2. Convert the plist to xml `plutil -convert xml1 /Users/Shared/test.plist`
  3. Edit the plist to remove a closing tag
  4. Attempt to read the plist `defaults read /Users/Shared/test`

openradrより

スポンサーリンク

検証

 この問題は2018年02月20日、High SierraでApp Store設定がパスワード無しでロック解除されてしまう不具合を発見した米Meredith Corporationのシステム管理者Eric HoltamさんによってOpen Radar(rdar://37729361)に投稿され、

defaults read deletes entire file when reading invalid plist

実際に現在最新のmacOS 10.13.3 build 17D102で検証してみましたが、レポートの通り作成したplistファイルを編集し”defaults read”をするとファイル自体が削除されてしまいました。

Steps to Reproduce

  1. defaults writeコマンドでplistファイルを作成&xml形式に変換。
  2. plistファイルをエディタで開き、</streing>タグを削除。
  3. defaults readコマンドでplistファイルを読み込む。
  4. plistファイルが消失する。
defaults write /Users/sie/Desktop/test test -string test
plutil -convert xml1 /Users/sie/Desktop/test.plist 
plistファイルを誤った記述に編集
defaults read /Users/sie/Desktop/test.plist
plistファイルが消える

High Sierra/iOS 11での機能強化が原因?

 このバグについてObjective-SeeのPatrickさんはCoreFoundation内でplistファイルを検証し”fails”だった場合にunlinkしてしまうことを確認し、他の開発者らからは、このバグはAppleがmacOS 10.13 High SierraおよびiOS 11でNSUserDefaultsの扱いを強化した事が原因ではないかというコメントが出ており、

Improved NSUserDefaults Handling of Invalid Files
In earlier versions, if an NSUserDefaults/CFPreferences backing plist file was replaced with a file that was not a valid property list with a dictionary as its root key, it could cause various problems. NSUserDefaults now detects this and deletes the invalid file to recover.

Foundation Release Notes for macOS 10.13 and iOS 11 – Apple

Appleが開発者向けに公開しているHigh Sierra/iOS 11のリリースノートにはNSUserDefaults now detects this and deletes the invalid file to recover.という記載があったため、発見当初はバグか新機能か議論が分かれていたようですが、昨日リリースされたmacOS 10.13.4 beta 3ではplistファイルの読み込みに失敗するだけでファイル自体の削除はされなかったため、少なくともdefaultsコマンドについてはバグだったようです。

macOS 10.13.4 beta 3のplist処理

 この問題はmacOS 10.12.6 Sierraなどには発生せず、AppleはmacOS 10.13.4で修正するようですが、macOS 10.13.3までのHigh Sierraにはdefaultsコマンドに限らず1箇所でも間違った記述のある設定ファイル(.plist)は読み込み時に削除され、設定が永遠に反映されない不具合があると覚えておくとトラブルシューティングに役立つかもしれません。

コメント

  1. 匿名 より:

    10.13は世に出してはいけないバージョン

  2. 匿名 より:

    もういっそmacOS 10.13.3までを消去してもいいような・・・
    High Sierraディスコンで
    SierraとかSnowLeopardあたりから新規ブランチで作り直してほしいくらい・・・