セキュアブラウザ製品「Chronos SystemGuard」のサポートを担当する屋代です。
先日ThinAppの新しいバージョンでパッケージを作成したところ、これまで問題なく動作していたアプリケーションがクラッシュする現象に遭遇しました。
この記事ではちょっとしたトラブルシューティング小ネタとして、制御フローガードに関するThinAppのBuildOptionsの既定値変更が原因だった事例を紹介し、ベンダーから案内された回避方法が有効に作用した機序について考察します。
発生した現象
弊社ではChronos SystemGuardをThinAppで仮想化して提供しています。1
定期的な動作検証の一環として、ThinApp 2512でパッケージを作成して起動確認を行ったところ、アプリケーションがクラッシュする問題に遭遇しました。
ひとつ前のバージョンであるThinApp 2503で作成したパッケージでは、問題は発生しません。他の条件は揃えていたので、ThinAppバージョンの差異が問題と考えられます。
原因は制御フローガードに関するBuildOptionsの既定値変更
Omnissa社のサポートから案内された内容は次のとおりでした。
- BuildOptionsの1つである
ControlFlowGuardOffの既定値が、ThinApp 2512からオンに変更された - 従来と同じ動作にしたい場合は
ControlFlowGuardOff=0を指定する
実際にPackage.iniへ設定を追加してパッケージを再作成したところ、クラッシュは解消しました。
また、その後リリースされたThinApp 2603でも同じ設定で正常に動作しています。
設定例
Package.iniのBuildOptionsに次の設定を追加します。
[BuildOptions]
ControlFlowGuardOff=0
ThinApp 2512以降へ移行したタイミングでアプリケーションの起動失敗やクラッシュが発生した場合は、一度試してみるとよさそうです。
案内された対処が有効に作用した機序の考察
ControlFlowGuardOff という名称が示すように、この設定はWindowsの「Control Flow Guard(CFG:制御フローガード)」に関連するものです。2
ThinApp 2512からは、制御フローガードが既定で無効となったことになります。
一方で、Chronos SystemGuardに含まれるlibcef.dll(CEFのWindows向け動的ライブラリ)では、制御フローガードを要求していると考えられます。
dumpbin /loadconfig libcef.dllコマンド実行結果が次のようになっていたためです。関係する箇所を抜粋します。
00010500 Guard Flags
CF instrumented
FID table present
これらのフラグは制御フローガードを有効にする/guard:cfフラグ付きでビルドした際に付与されるものです。 3
以上から、CEF側の要求とThinAppの状態が一致しなかったために生じた事象と推測しています。
残念ながら、『Omnissa ThinApp Package.ini パラメータ リファレンス ガイド』には各オプションの詳細な動作説明までは記載されておらず、どのような条件で影響が出るのかまでは確認できていません。
まとめ
ThinApp 2512以降では、BuildOptionsの ControlFlowGuardOff に関する既定値が変更されていました。
ThinApp化するアプリが制御フローガードを有効にしてビルドされている場合、このことが原因でクラッシュする可能性があります。同様の状況に該当する場合は、Package.iniに ControlFlowGuardOff=0 を追加して挙動を確認してみてください。
「Chronos SystemGuard」以外にも、クリアコードではMozilla FirefoxやThunderbirdといったデスクトップ環境向けソフトウェア、GroongaやFluentdといったミドルウェアなど、幅広いオープンソースソフトウェアについてもテクニカルサポートを有償にて提供しています。
これらの製品のご利用にあたりお困りごとや不明な点がありましたら、ぜひお問い合わせフォームよりご相談ください。
-
製品の詳細は過去記事「セキュアブラウザ「Chronos SystemGuard」と最新版定期リリースのご紹介」にあります。 ↩
-
CFGの概要はMicrosoft Learnのプラットフォームのセキュリティのための制御フロー ガードにあります。 ↩
-
攻撃者がポインタやテーブルを書き換えて任意コード実行を試みても、リストにない番地へのジャンプはクラッシュする結果となります。 ↩