CS.SV.USAGERULES.PERMISSIONS

特権昇格への露呈

一部の関数では、正しく実行するための特殊な権限が必要とされるか、特定のユーザーまたは特定グループのメンバーだけ (ローカル管理者など) が実行することができます。その他の関数では、ユーザーのアカウントで特定の権限 (システムリソースへのアクセスを取得する権限など) が有効にされることが必要とされます。たとえば、ネットワークサービスでは、権限 TCP または UDP ポートを割り当てるには、スーパーユーザー権限が必要とされることがよくあります。この作業は、普通のユーザーは行えません。

昇格された権限が必要となるのは一時的に過ぎない場合でも、多くのプログラムではそれらの昇格された権限が削除されずに残るので、不必要なルート権限で実行され続けます。

低権限プログラムが、高権限操作 (権限ファイルを開くなど) を実行する必要があるときは、setuid を使用して権限を昇格する必要があります。setuid 機能では、ルート権限で実行するユーザーとして実行可能ファイルを起動することができます。ここでも、プログラムが高権限操作の実行終了後すぐに低権限に戻らないことは珍しくありません。

CS.SV.USAGERULES.PERMISSIONS チェッカーは、一般的に使用されるいくつかの権限昇格関数の呼び出しのインスタンスを検出し、レビューのためにそれらにフラグを立てます。

脆弱性とリスク

特殊な権限を必要とする関数を呼び出す必要があるアプリケーションは、システムをハッカーによる攻撃にさらしたままにする可能性があります。余計な権限で実行すると、オペレーティングシステムまたは環境での通常のセキュリティチェックが無効になる可能性があります。さらに、昇格された権限を使用する操作中に、あらかじめ存在する弱点がセキュリティ脆弱性に変わります。アプリケーションを昇格された権限で実行するのは、短時間に制限し、関係するセキュリティへの影響をユーザーに通知する必要があります。無許可のコードが制御を取得できる可能性をできるだけ抑えるため、システムを必要な最も低い権限レベルで実行することをお勧めします。

軽減と防止

アプリケーションを実行する必要があるのはどのタイプのアカウントなのかを確立するための最初の手順は、アプリケーションが使用するリソースおよびアプリケーションが呼び出す権限 API を調べることです。アプリケーションまたはその大部分で、管理者権限が不要であることに気付くことがあります。Writing Secure Code (Michael Howard、David LeBlanc 共著) では、この評価を実行するための優れた説明が行われており、読むことを強くお勧めします。

悪意のある攻撃にさらさないようにするため、次の手法を採用してください。

  • できるだけ権限の低いアカウントで実行し、権限の昇格をできるだけ遅らせ、できるだけ早く権限を降格させます。これを行う 1 つの方法は、Privilege Check を使用して、トークンで有効になっている権限を判定することです。使用できる権限が、現在の操作にふさわしくない場合、そのコードを無効にし、ユーザーに管理者権限のあるアカウントにログインするよう促すことができます。
  • ユーザーがユーザー名とパスワードで適切に認証されていることを確認します。
  • 権限コードを分離します。管理者パーミッションを必要とする関数を複数の別々のアプリケーションに分散させます。
  • 正しい廃止順序で権限を削除していきます。setuid プログラムと setguid プログラムの場合、グループレベルの権限を削除してからユーザーレベルの権限を削除することが重要です。
  • 昇格された権限が正常に削除されたことを検証します。

実装

CS.SV.USAGERULES.PERMISSIONS チェッカーは、レビューのために次の呼び出しにフラグを立てます。

  • Android.Systems.Os.Chmod o Android.Systems.Os.Chown o Android.Systems.Os.Setegid
  • Android.Systems.Os.Setenv o Android.Systems.Os.Seteuid o Android.Systems.Os.Setgid
  • Android.Systems.Os.Setsid o Android.Systems.Os.Setuid o Android.Systems.Os.Fchmod
  • Android.Systems.Os.Fchown o System.ServiceProcess.ServiceControllerPermissionAttribute.CreatePermission
  • System.ServiceProcess.ServiceControllerPermissionEntryCollection.Insert
  • System.Security.Permissions.DataProtectionPermissionAttribute.CreatePermission
  • System.Security.Permissions.EnvironmentPermissionAttribute.CreatePermission
  • System.Security.Permissions.FileDialogPermissionAttribute.CreatePermission
  • System.Security.Permissions.FileIOPermissionAttribute.CreatePermission
  • System.Security.Permissions.GacIdentityPermissionAttribute.CreatePermission
  • System.Security.Permissions.HostProtectionAttribute.CreatePermission
  • System.Security.Permissions.IsolatedStorageFilePermissionAttribute.CreatePermission
  • System.Security.Permissions.KeyContainerPermissionAccessEntryCollection.Add
  • System.Security.Permissions.KeyContainerPermissionAttribute.CreatePermission
  • System.Security.Permissions.MediaPermissionAttribute.CreatePermission
  • System.Security.Permissions.PermissionSetAttribute.CreatePermission
  • System.Security.Permissions.PrincipalPermissionAttribute.CreatePermission
  • System.Security.Permissions.PublisherIdentityPermissionAttribute.CreatePermission
  • System.Security.Permissions.ReflectionPermissionAttribute.CreatePermission
  • System.Security.Permissions.RegistryPermissionAttribute.CreatePermission
  • System.Security.Permissions.ResourcePermissionBase.AddPermissionAccess
  • System.Security.Permissions.SecurityAttribute.CreatePermission
  • System.Security.Permissions.SecurityPermissionAttribute.CreatePermission
  • System.Security.Permissions.SiteIdentityPermissionAttribute.CreatePermission
  • System.Security.Permissions.StorePermissionAttribute.CreatePermission
  • System.Security.Permissions.StrongNameIdentityPermissionAttribute.CreatePermission
  • System.Security.Permissions.UIPermissionAttribute.CreatePermission
  • System.Security.Permissions.UrlIdentityPermissionAttribute.CreatePermission
  • System.Security.Permissions.WebBrowserPermissionAttribute.CreatePermission
  • System.Security.Permissions.ZoneIdentityPermissionAttribute.CreatePermission
  • System.Net.DnsPermissionAttribute.CreatePermission o System.Net.SocketPermission.AddPermission
  • System.Net.SocketPermissionAttribute.CreatePermission o System.Net.WebPermission.AddPermission
  • System.Net.WebPermissionAttribute.CreatePermission

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。