macOS 10.13.3までのHigh Sierraに誤った記述のplist設定ファイルを読み込むとファイル自体が削除されてしまうバグが発見され、開発者らが注意を促しています。詳細は以下から。
macOSにはアプリやシステムのユーザー設定などを記述したXML形式のプロパティリスト(以下、plist)を読み書きするためのdefaultsコマンドが存在しますが、macOS 10.13 High Sierraには、このdefaultsコマンドなどで誤った記述があるplistを読み込むとファイル自体が削除されてしまうバグが発見され、開発者らが注意を促しています。
Bug submitted.
rdar://37729361https://t.co/gwNGalwk5Z— Eric Holtam (@eholtam) 2018年2月21日
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:
- Create a plist `defaults write /Users/Shared/test test -string test
- Convert the plist to xml `plutil -convert xml1 /Users/Shared/test.plist`
- Edit the plist to remove a closing tag
- 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)に投稿され、
実際に現在最新のmacOS 10.13.3 build 17D102で検証してみましたが、レポートの通り作成したplistファイルを編集し”defaults read”をするとファイル自体が削除されてしまいました。
Steps to Reproduce
- defaults writeコマンドでplistファイルを作成&xml形式に変換。
- plistファイルをエディタで開き、</streing>タグを削除。
- defaults readコマンドでplistファイルを読み込む。
- 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の扱いを強化した事が原因ではないかというコメントが出ており、
as (now publicly) noted "H. Sierra's `defaults read` command DELETES your plist if invalid"-@kcrawford Here's the bug/reason why: -[CFPDSource copyPropertyListWithoutDrainingPendingChangesValidatingPlist:] in CoreFoundation calls unlink() if plist validation fails🐛🤣 #bug #apple pic.twitter.com/xbhR20MwgO
— patrick wardle (@patrickwardle) 2018年2月21日
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.12.6 Sierraなどには発生せず、AppleはmacOS 10.13.4で修正するようですが、macOS 10.13.3までのHigh Sierraにはdefaultsコマンドに限らず1箇所でも間違った記述のある設定ファイル(.plist)は読み込み時に削除され、設定が永遠に反映されない不具合があると覚えておくとトラブルシューティングに役立つかもしれません。
The issue doesn't exist in 10.12.6.
— Eric Holtam (@eholtam) 2018年2月21日
Fixed in beta. https://t.co/hqMGlb6Gy3
— Clayton Burlison (@clburlison) 2018年2月21日
コメント
10.13は世に出してはいけないバージョン
もういっそmacOS 10.13.3までを消去してもいいような・・・
High Sierraディスコンで
SierraとかSnowLeopardあたりから新規ブランチで作り直してほしいくらい・・・