flawopen.com/Teardowns/cve-2026-65995-osmand-aidl-authorization
CVE-2026-65995:OsmAnd AIDLの認可バイパス
OsmAnd 5.3.3は、公開されたAndroid AIDLサービスで未知の呼び出し元を自動承認し、端末にインストール済みのアプリから位置情報やファイル操作へアクセスできる状態でした。公開アドバイザリは修正を確認していますが、最初の修正版やCVSSスコアは示していません。
来訪者名簿を確認するはずのビル受付が、新しい訪問者を到着した瞬間に承認済みリストへ追加する様子を想像してください。OsmAndのサービスは同じ端末のアプリに対して同じことをしていました。未知の呼び出し元を有効として登録し、連携インターフェースを使わせていました。修正では明示的な承認を求め、呼び出し元の正しいAndroid IDに結び付ける必要があります。
主要な概念と専門用語
AIDL- Android Interface Definition Language。Binder IPCを通じて、あるAndroidプロセスから別プロセスが公開するメソッドを呼び出す仕組みです。
公開サービス- 他のアプリが接続できるAndroidサービスです。機密メソッドはpermissionまたは同等の呼び出し元検証で保護します。
呼び出し元UID- OSがアプリプロセスに割り当てるIDです。呼び出し元が渡すパッケージ名を信用せず、Binderから取得します。
CWE-862- 共有された認可境界の欠落に対するFlawOpenの編集上の分類です。GHSLは複数の弱点の一つとしてCWE-862を記載していますが、CVSSスコアは公表していません。
フレームワーク対応
- FlawOpenによるMITRE CWEへの概念上の対応付けです。ベンダーやCVEレコードがこの研究デモに弱点IDを割り当てたものではありません。 CWE-862
根本原因の分析 (Root Cause)
GitHub Security LabはOsmAnd 5.3.3を調査し、公開されたOsmandAidlServiceV2にAndroid permissionがなく、OsmandAidlApi.isAppEnabled()が未知のConnectedAppをenabled=trueで作成すると報告しました。getApi()はこの判定でAIDL呼び出しを制御していたため、新規のローカルアプリをユーザー承認まで拒否せず、認可済みとして保存していました。GHSLによると、これにより位置情報やナビゲーション情報を返すメソッド、パストラバーサルのあるファイル操作など97のAIDLメソッドが露出しました。攻撃者は同じ端末にアプリを事前インストールする必要がありますが、位置情報permissionや追加のユーザー操作は不要です。ファイルへの影響はOsmAndのストレージサンドボックス内であり、端末全体のファイルシステムへのアクセスではありません。開発者は2026年6月28日に修正を確認しましたが、アドバイザリは最初の修正版を示していません。CVSSスコアは公表されていません。FlawOpenは位置情報の漏えいと完全性に影響する操作が露出したため、重大度を編集判断でHighとしています。CWE-862はFlawOpenの主要な編集上の対応付けであり、GHSLがそれだけを割り当てたという意味ではありません。
ステップ・バイ・ステップの攻撃フロー
ローカルアプリが公開サービスへ接続
脆弱なサービスはAndroid permissionなしで公開されていました。同じ端末のアプリはOsmAndの位置情報permissionを求めずに接続できました。
認可確認が自ら承認を作成
未知のパッケージに対してisAppEnabled()はenabled=trueのConnectedAppを作成して保存しました。確認処理が本来検証すべきアクセスを付与していました。
共有ゲートから複数機能へ到達
getApi()はその結果を使ってAIDL呼び出しを処理しました。GHSLによると、getAppInfo()やファイルコピーを含む97メソッドに到達できました。
影響範囲は確認済みの条件に限定
悪意あるアプリは端末にインストール済みである必要があります。GHSLが示すのは位置/ナビゲーション情報の露出とOsmAndサンドボックス内のファイル影響であり、端末全体へのアクセスや顧客環境での実悪用ではありません。
ソースコード比較:脆弱 vs 堅牢化
脆弱な抜粋はGHSLが調査した5.3.3の分析から引用しています。下の例は最小限のfail-closed方針のスケッチで、OsmAndのパッチでも完全な認可実装でもありません。承認フローではUID、インストール済みパッケージの署名、ユーザー同意、各メソッドに必要な権限範囲を検証する必要があります。本番サービスではBinder境界で認可し、機密メソッドごとにも権限を制限してください。GHSLは修正を確認していますが、完全なdiffや最初の修正版は公開していません。サポート対象版へ更新し、ベンダーの最新情報を確認してください。コードは教育用で、exploitや位置/ファイルpayloadを含みません。
ソース抜粋: メソッド:isAppEnabled()
public boolean isAppEnabled(@NonNull String pack) {
ConnectedApp connectedApp = connectedApps.get(pack);
if (connectedApp == null) {
connectedApp = new ConnectedApp(app, pack, true);
connectedApps.put(pack, connectedApp);
saveConnectedApps();
}
return connectedApp.isEnabled();
}
private final Set<Integer> approvedCallerUids = new HashSet<>();
private boolean isAppEnabled() {
// ユーザーの明示的な承認と本人確認の後にのみ値を設定する。
return approvedCallerUids.contains(Binder.getCallingUid());
}
エンジニアリング&システム堅牢化チェックリスト
- ✓OsmAndを現在サポートされている版へ更新してください。GHSLは修正を確認していますが、最初の修正版は示していません。アドバイザリの日付から修正版の下限を推測しないでください。
- ✓Androidサービスでは未知のBinder UIDをデフォルトで拒否します。明示的なユーザー承認とインストール済みパッケージの署名検証後にのみアクセスを許可します。
- ✓公開サービスの境界で認可し、AIDLメソッドごとに最小権限を適用します。一般的な連携許可で位置情報、ログ、ファイル操作を自動公開しないでください。
- ✓引数で渡されるパッケージ名は信頼しないでください。
Binder.getCallingUid()からIDを取得し、パッケージとUID、署名証明書の対応を検証します。 - ✓ファイル操作をアプリ所有の正規化されたルート内に制限し、外へ出るパスを拒否します。認可はパス検証の代わりになりません。
- ✓Android manifestを確認し、permissionなしの公開サービスを探します。初回呼び出し、承認取消し、再インストール/署名変更、各機密AIDLメソッドをテストします。
- ✓アドバイザリは研究者のPoCを報告しており、顧客端末での実悪用は確認していません。公開だけを侵害の証拠とみなさず、端末内の兆候を調査してください。