ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

SDDLで学ぶWindowsのアクセス制御

北原です。 今回は、Windows OSを守るセキュリティ機能の中でも重要な役割を担う、アクセス制御に関する話題を解説します。

UnixLinuxでは「Everything is a file」と言われていますが、Windows OSではファイルやプロセスをはじめとする全てのものがオブジェクトとして管理されており、それぞれが ACLAccess Control List:アクセス制御リスト) によりアクセス制御されています。 ACLは、アカウントに与えているアクセス権限を個別に定義した ACE(Access Control Entry:アクセス制御エントリ) と呼ばれる情報のリストです。 例えば、Windows OSでファイルのプロパティを開くと、以下の図のようにACLが視覚的に確認できます。

DACLの確認例

ファイルやディレクトリなどでは、Windows OS標準の機能でこのように視覚的にACLが確認できますが、オブジェクトの種類によってはそうではありません。 Windows OSのACLは、Security Descriptor(セキュリティ記述子) と呼ばれる一定の書式に従ったバイナリデータとして管理されているため、そのままでは人間にとっての可読性が高くありません。 そこで、Security Descriptorを定義するバイナリデータと等価な情報を、人間にとって可読性がある状態で表現するために、SDDL(Security Descriptor Definition Language:セキュリティ記述子定義言語) という文字列が定義されていますが、癖が強いため解読に慣れるのはやや手間です。

本記事では、Windows OSでのアクセス制御設定の効率的な管理や調査を助けるために、SDDLの読み方を中心に、以下の内容を解説します。

SDDL解読のための基礎知識

SDDL自体を解説する前に、まずは必要最低限の基礎知識から解説します。

Security Identifier

Windows OSでは、全てのアカウントは SID(Security Identifier:セキュリティ識別子) と呼ばれるバイナリデータで管理されています。 例えば、Windows OS上でコマンドプロンプトcmd.exe)やPowerShellpowershell.exe)を起動して wmic.exe を実行すると、以下のようにOSに登録されているユーザアカウントのSIDが確認できます。

C:\>wmic.exe useraccount get name,sid
Name                SID
admin               S-1-5-21-2659926013-4203293582-4033841475-500
DefaultAccount      S-1-5-21-2659926013-4203293582-4033841475-503
Guest               S-1-5-21-2659926013-4203293582-4033841475-501
recovery            S-1-5-21-2659926013-4203293582-4033841475-1001
WDAGUtilityAccount  S-1-5-21-2659926013-4203293582-4033841475-504
Administrator       S-1-5-21-3654360273-254804765-2004310818-500
Guest               S-1-5-21-3654360273-254804765-2004310818-501
krbtgt              S-1-5-21-3654360273-254804765-2004310818-502
david               S-1-5-21-3654360273-254804765-2004310818-1104
jeff                S-1-5-21-3654360273-254804765-2004310818-1105
sqlsvc              S-1-5-21-3654360273-254804765-2004310818-2101
caadmin             S-1-5-21-3654360273-254804765-2004310818-2601

PowerShellの場合は、Get-CimInstance または Get-WmiObject コマンドレットでWMIから情報が取得できます。 Get-CimInstance コマンドレットの場合は、以下のようにアカウント名とSIDが確認できます。

PS C:\> Get-CimInstance -ClassName Win32_UserAccount | Select-Object -Property name,sid

name               sid
----               ---
admin              S-1-5-21-2659926013-4203293582-4033841475-500
DefaultAccount     S-1-5-21-2659926013-4203293582-4033841475-503
Guest              S-1-5-21-2659926013-4203293582-4033841475-501
recovery           S-1-5-21-2659926013-4203293582-4033841475-1001
WDAGUtilityAccount S-1-5-21-2659926013-4203293582-4033841475-504
Administrator      S-1-5-21-3654360273-254804765-2004310818-500
Guest              S-1-5-21-3654360273-254804765-2004310818-501
krbtgt             S-1-5-21-3654360273-254804765-2004310818-502
david              S-1-5-21-3654360273-254804765-2004310818-1104
jeff               S-1-5-21-3654360273-254804765-2004310818-1105
sqlsvc             S-1-5-21-3654360273-254804765-2004310818-2101
caadmin            S-1-5-21-3654360273-254804765-2004310818-2601

S-1- で始まる文字列が、SIDのバイナリデータを文字列として表現したものです。 例として S-1-5-32-544 というSID文字列を用います。 SID文字列を - で区切った場合、それぞれ以下のような意味を持ちます。

  • S - SID文字列であることを示しています
  • 1 - SIDのリビジョンレベル(書式のバージョンという認識で問題ありません)を表しています。本記事の執筆時点では必ず 1 です
  • 5 - 識別子機関(アカウントの登録先くらいの認識で問題ありません)の値を示しています

アカウント名ではなくSIDによりアカウントを管理することで、アカウントの名前が変更されてもWindows OSは一意にアカウントを識別できるという仕組みです。 本記事ではあまり詳しくは触れませんが、SIDはOS内部ではバイナリデータとして処理されており、以下のSID構造体で定義されています。

typedef struct _SID {
  BYTE                     Revision;
  BYTE                     SubAuthorityCount;
  SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
#if ...
  DWORD                    *SubAuthority[];
#else
  DWORD                    SubAuthority[ANYSIZE_ARRAY];
#endif
} SID, *PISID;

Security Descriptor

Security Descriptorはオブジェクトのセキュリティ設定を定義するバイナリデータであり、その書式は以下の SECURITY_DESCRIPTOR 構造体に従います(実際には、状況に応じて定義が少し異なる構造体が用いられますが、初心者にはややこしい話なので本記事では割愛します)。

typedef struct _SECURITY_DESCRIPTOR {
  BYTE                        Revision;
  BYTE                        Sbz1;
  SECURITY_DESCRIPTOR_CONTROL Control;
  PSID                        Owner;
  PSID                        Group;
  PACL                        Sacl;
  PACL                        Dacl;
} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;

Revision はSecurity Descriptorの書式バージョンを示す1 byteの値であり、基本的には 1 です。 Sbz1 は、構造体データの大きさを調整するための1 byteの値であり、0 が設定されます。 Control は2 byte(16 bit)のフラグ値であり、自身の構造体に定義されている情報などを示す値が設定されます。 アクセス制御は、OwnerGroupSaclDacl の4つの値で定義されます。 Security Descriptorのバイナリデータの概要を図示化すると、以下のようになります。

Security Descriptorのデータ構造の概要図

Owner には、オブジェクトの所有者アカウントを示すSIDのバイナリデータが保存されているメモリアドレスの値が設定されます。 オブジェクトの所有者アカウントは、オブジェクトに対して全ての操作が可能であるため重要です。

Group には、グループアカウントのを示すSIDのバイナリデータが保存されているメモリアドレスの値が設定され、そのグループアカウントはプライマリグループと呼ばれています。 プライマリグループはオブジェクトの作成時に設定される情報ですが、基本的には使用されない情報であるため、とりあえずは気にしなくて問題ありません。

Sacl には、SACL(System Access Control List)と呼ばれるACLのバイナリデータが格納されているメモリアドレスの値が設定されます。 SACLは、Windows OS上での監視設定の情報が定義されるACLです。 記事の趣旨とは異なるため、本記事では触れません。

最後に定義されている Dacl には、DACL(Discretionary Access Control List)と呼ばれるACLのバイナリデータが格納されているメモリアドレスの値が設定されます。 オブジェクトの操作に関するアクセス制御設定は、DACLの定義に従うため、Windows OSのセキュリティに携わる上で最も触れる機会が多いのがDACLでしょう。 本記事では、このDACLを中心に解説していきます。

Access Mask

アクセス権限はAccess Maskと呼ばれる32 bitの値で表現されており、各ビットに意味があります。 32 bitのうちの上位16 bitは全てのオブジェクトでの使用が想定されているアクセス権限を示しており、下位16 bitは管理対象のオブジェクトに固有なアクセス権限を管理するために用いられます。 以下のような構成になっています。

Access Maskの概要

上位16 bitのうち、最上位の4 bit(0xF0000000)の部分は Generic Right(汎用権限) と呼ばれています。 UNIX系OSでいうRead/Write/Executeに対応する権限を示すフラグ値であり、それぞれ以下の表のような意味を持ちます。

権限名 Access Mask 概要
GENERIC_READ 0x80000000 オブジェクトに対する読み取り権限
GENERIC_WRITE 0x40000000 オブジェクトに対する書き込み権限
GENERIC_EXECUTE 0x20000000 オブジェクトに対する実行および調査権限
GENERIC_ALL 0x10000000 オブジェクトに対する読み取り、書き込み、実行権限

上位16 bitのうち、下位5 bit(0x001F0000)の部分は Standard Right(標準権限) と呼ばれており、それぞれ以下の表のような意味を持ちます。

権限名 Access Mask 概要
SYNCHRONIZE 0x00100000 オブジェクトからの同期シグナルを待機する権限
WRITE_OWNER 0x00080000 オブジェクトの所有者アカウントを変更する権限
WRITE_DAC 0x00040000 オブジェクトのセキュリティ情報を書き込む権限
READ_CONTROL 0x00020000 オブジェクトのセキュリティ情報を読み取る権限
DELETE 0x00010000 オブジェクトを削除する権限

上位16 bitのうち、10 bit目と9 bit目(0x020000000x01000000)の2 bitは、Windows APIでアクセス権限を要求する際に用いる特別なフラグ値です。

権限名 Access Mask 概要
MAXIMUM_ALLOWED 0x02000000 可能な限りの権限を要求していることを示すフラグ値
ACCESS_SYSTEM_SECURITY 0x01000000 オブジェクトの監査設定情報(SACL)を読み取る権限

MAXIMUM_ALLOWEDは、Windows APIでオブジェクトに対するアクセス権限を取得する際に、可能な限りの高い権限を要求したい場合に使用するフラグ値です。 ただし、MAXIMUM_ALLOWEDを指定してWindows APIを指定する場合は実行権限によって動作が大きく異なります。 本記事の趣旨からは逸れるため詳しくは解説しませんが、システムプログラミングの観点では、必要な動作を実行するために必要なアクセス権限をしっかり把握してアクセス権限を要求し、MAXIMUM_ALLOWEDは使わない方が無難です。

Access Maskの上位16 bitのその他の部分は定義されておらず、Windows OSでは使用されていません。 下位16 bitの値に関しては、オブジェクトによってそれぞれ意味が異なります。 例えば、プロセスのアクセス権を示すAccess Maskの値は、Microsoft公式文書のOpenProcess APIなどの文書にリンクが記載されている「セキュリティとアクセス権の処理」に掲載されています。 また、アクセス権限を要求するWindows APIの個別の文書にも、各オブジェクトに適用される下位16 bitのAccess Maskの値の意味が掲載されています。

レジストリやファイルの場合は、一つの権限を表現するために複数のビットが用いられます。 ファイルの場合は以下の表の通りです。

権限名 Access Mask 概要
FILE_GENERIC_ALL 0x001F01FF ファイルに対する全権限
FILE_GENERIC_READ 0x00120089 ファイルの読み取り権限
FILE_GENERIC_WRITE 0x00100116 ファイルの書き込み権限
FILE_GENERIC_EXECUTE 0x001000A0 ファイルの実行権限

レジストリの場合は以下の表の通りです。

権限名 Access Mask 概要
KEY_ALL_ACCESS 0x000F003F レジストリに対する全権限
KEY_READ 0x00020019 レジストリの読み取り権限
KEY_WRITE 0x00020006 レジストリの書き込み権限
KEY_EXECUTE 0x00020019 名前としては存在しますが、値自体はKEY_READと同じであるため、KEY_READと同一の権限

ACLとACE

ACLは、アカウントに対するアクセス権限を定義した個別のACEを、リストとしてまとめた構造体です。 ACLのバイナリデータの先頭部分は、以下のACL構造体で定義されており、このACL構造体のデータに連続する形でACEを定義する構造体のデータが配置されます。

typedef struct _ACL {
  UCHAR  AclRevision;
  UCHAR  Sbz1;
  USHORT AclSize;
  USHORT AceCount;
  USHORT Sbz2;
} ACL;

AclRevision にはACLの形式を示す識別番号が設定され、多くの場合は 24 が設定されます。 Sbz1 はデータの整列に用いられるパディングであり、0 が設定されます。 AclSize は、名前が示す通り、ACLを定義する構造体と続く全てのACEを定義する構造体のデータ長を合わせたバイナリデータのサイズが設定され、ACEを定義する構造体の数(エントリ数)は AceCount に設定された数で指定されます。

ACEを定義する構造体はやや複雑です。 本記事で全てを解説するのは困難であるため、要点だけ触れます。 まず、ACEを定義する構造体の先頭には、以下のACE_HEADER構造体により、ACEの種類(AceType)、性質(AceFlags)、データサイズ(AceSize)を示します。

typedef struct _ACE_HEADER {
  BYTE AceType;
  BYTE AceFlags;
  WORD AceSize;
} ACE_HEADER;

AceType に指定された値によって、ACEを定義する構造体が何なのかが判断できる仕組みです。 最もよく眼にする AceType の値はACCESS_ALLOWED_ACE_TYPE(0)でしょう。 ACCESS_ALLOWED_ACE_TYPEの場合は、ACE_HEADER構造体を含むACEを定義する構造体んデータは、以下のACCESS_ALLOWED_ACE構造体の定義に従います。

typedef struct _ACCESS_ALLOWED_ACE {
  ACE_HEADER  Header;
  ACCESS_MASK Mask;
  DWORD       SidStart;
} ACCESS_ALLOWED_ACE;

Header の部分の、先述のACE_HEADER構造体が配置されており、それに続けてAccess Maskによりアクセス権限を示す Mask が定義されます。 SidStart は、初見だとややわかりにくいですが、擬似的な構造体メンバーであり、この部分からアカウントの情報を示すSIDのバイナリデータが配置されます(つまり実際に配置されるデータの型はDWORDではなくSID構造体そのものです)。 ACE関連の他の構造体について興味がある場合は、Microsoft公式文書のACE_HEADER構造体のページを参照してください。

続けて、ACE_HEADER構造体の AceFlags ですが、この部分には先述の通りACEの性質を示すフラグ値が設定されます。 入門記事としてはやや難しい話であるため、本記事では詳細には触れませんが、Active Directoryで管理するオブジェクトの場合だと、ACE情報が他のオブジェクトからの継承により作成されたことを示すフラグが設定される場合があります。 例えば、ドメイングループに所属しているユーザアカウントのあるACEが、所属しているグループのACEの引き継ぎにより作成された場合です。

SDDLの取得と解読の方法

ここまでで解説してきたACLやACEのバイナリデータの定義は、システムプログラミングに取り組む開発者などにとっては必要ですが、そうでない人にとっては難解です。 そこで、より幅広い利用者がACLやACEを、コマンドプロンプトなどで簡単に確認できるように、SDDL文字列というものが定義されています。 SDDLは、Security Descriptorの情報を人間にとって可読な形式で表示するための言語ですが、やや癖が強いため、解読するには知識が必要です。 SDDLが解読できると、コマンドラインで手軽にACLの設定が確認できるため、取得と解読の方法を身に付けておくと調査が便利になります。

ACL情報の取得

PowerShellには、ACLを確認するための Get-Acl というコマンドレットが実装されています。 -Path パラメータに、ACLを確認したいオブジェクトのパスを指定します。 例えば、C:\ に設定されているACLを確認したい場合は、以下のように実行します。

PS C:\> Get-Acl -Path C:\ | Format-List


Path   : Microsoft.PowerShell.Core\FileSystem::C:\
Owner  : NT SERVICE\TrustedInstaller
Group  : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\Authenticated Users Allow  AppendData
         NT AUTHORITY\Authenticated Users Allow  -536805376
         NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  FullControl
         BUILTIN\Users Allow  ReadAndExecute, Synchronize
Audit  :
Sddl   : O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:SYD:PAI(A;;LC;;;AU)(A;OICIIO;SDGXGWGR;;;AU)(
         A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)

OwnerGroupAccessAudit がそれぞれSecurity Descriptorの OwnerGroupDaclSacl に対応しています。 SACLに対応する Audit の値が空ですが、この場合はSACL自体が設定されていないか、権限が不足しているためです。 SACLを確認したい場合は SeSecurityPrivilege 特権が必要であるため、管理者権限で調査する必要があります。 SeSecurityPrivilege 特権が使用できる状態で確認しても Audit の値が空であるならば、SACLが設定されていないと言えます。

Active Directoryのオブジェクトに設定されているACLを調べたい場合は、少し手間が必要です。 例として、contoso.local というドメインで、CL01 という端末のACLを確認する場合を示します。 まずはActive Directoryドメインドメインコントローラにログオンして、PowerShellを起動し、ActiveDirectory モジュールをインポートします。

Import-Module ActiveDirectory

続けて、Active Directoryに登録されている CL01 に対応するオブジェクトのパスを調べます。 ActiveDirectory モジュールの Get-ADComputer コマンドレットを用いる場合は、以下のようにオブジェクトのパスが取得できます。

PS C:\> $dn = (Get-ADComputer -Identity cl01).distinguishedname
PS C:\> $objPath = "AD:\$($dn)"
PS C:\> $objPath
AD:\CN=CL01,CN=Computers,DC=contoso,DC=local

以上の例の場合は、AD:\CN=CL01,CN=Computers,DC=contoso,DC=localCL01 に対応するActive Directoryオブジェクトのパスです。 あとはファイルなどの場合と同様に、Get-Acl コマンドレットを実行するだけです。

PS C:\> Get-Acl -Path $objPath | Format-List


Path   : Microsoft.ActiveDirectory.Management.dll\ActiveDirectory:://RootDSE/CN=CL01,CN=Computers,DC=contoso,DC=local
Owner  : CONTOSO\Domain Admins
Group  : CONTOSO\Domain Admins
Access : NT AUTHORITY\SELF Allow
         NT AUTHORITY\Authenticated Users Allow
         NT AUTHORITY\SYSTEM Allow
         BUILTIN\Account Operators Allow
         CONTOSO\Domain Admins Allow
         Everyone Allow
         NT AUTHORITY\SELF Allow
         NT AUTHORITY\SELF Allow
         NT AUTHORITY\SELF Allow
         BUILTIN\Print Operators Allow
         BUILTIN\Windows Authorization Access Group Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Domain Admins Allow
         CONTOSO\Cert Publishers Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         CONTOSO\Key Admins Allow
         CONTOSO\Enterprise Key Admins Allow
         CONTOSO\Domain Admins Allow
         CREATOR OWNER Allow
         NT AUTHORITY\SELF Allow
         NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS Allow
         NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS Allow
         NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS Allow
         NT AUTHORITY\SELF Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         NT AUTHORITY\SELF Allow
         NT AUTHORITY\SELF Allow
         CONTOSO\Enterprise Admins Allow
         BUILTIN\Pre-Windows 2000 Compatible Access Allow
         BUILTIN\Administrators Allow
Audit  :
Sddl   : O:DAG:DAD:AI(A;;CCDC;;;PS)(A;;LCRPLORC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO
         ;;;AO)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;DA)(OA;;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;;WD)(OA;;RPWP;77b5b886-
         944a-11d1-aebd-0000f80367c1;;PS)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;PS)(OA;;SW;72e39547-7b18-11d1-ad
         ef-00c04fd8d5cd;;PS)(OA;;CCDC;bf967aa8-0de6-11d0-a285-00aa003049e2;;PO)(OA;;RP;46a9b11d-60ae-405a-b7e8-ff8a58d
         456d2;;S-1-5-32-560)(OA;;WP;bf967953-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;
         WP;4c164200-20c0-11d0-a768-00aa006e0529;;DA)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;DA)(OA;;SW;72e39547-
         7b18-11d1-adef-00c04fd8d5cd;;DA)(OA;;WP;3e0abfd0-126a-11d0-a060-00aa006c33ed;bf967a86-0de6-11d0-a285-00aa00304
         9e2;DA)(OA;;WP;bf967950-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;WP;5f202010-7
         9a5-11d0-9020-00c04fc2d4cf;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;RPWP;bf967a7f-0de6-11d0-a285-00aa00304
         9e2;;CA)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;
         RP;4c164200-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f202010-79a5-11
         d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4c
         f;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45b
         c-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2
         ;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;5
         9ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b
         422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf
         967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIID;RPWP;5b47d60f-6090-40b2-9f37-2a4de88f3063;;S-1-5-21-3654360273-
         254804765-2004310818-526)(OA;CIID;RPWP;5b47d60f-6090-40b2-9f37-2a4de88f3063;;S-1-5-21-3654360273-254804765-200
         4310818-527)(OA;ID;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;;DA)(OA;CIIOID;SW;9b026da6-0d3c-465c-8bee-5199d7165
         cba;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;CIID;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;bf967a86-0de6-11d
         0-a285-00aa003049e2;PS)(OA;CIID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0de6-11d0-a285-00aa003049e2;E
         D)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c
         69e6d-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIID;WP;ea1b7b93-5e48-46d5-bc6c-
         4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)(OA;CIIOID;LCRPLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28
         ;RU)(OA;CIIOID;LCRPLORC;;bf967a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;LCRPLORC;;bf967aba-0de6-11d0-a285-
         00aa003049e2;RU)(OA;OICIID;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)(OA;CIID;RPWPCR;91e647de-d96f-4b70-95
         57-d63ff4f3ccd8;;PS)(A;CIID;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3654360273-254804765-2004310818-519)(A;CIID;
         LC;;;RU)(A;CIID;CCLCSWRPWPLOCRSDRCWDWO;;;BA)

ファイルの場合と比較すると、かなり複雑なSDDL文字列が確認できます。 DACLを示す Access の値に CONTOSO\Domain Admins Allow などの重複した行が目立ちますが、これはActive Directoryに固有のアクセス権限を正確に表現できていないためです。 一方で、SDDLはオブジェクトに設定されたSecurity Descriptorを正確に表現しているため、この例の場合はSDDLを解読しなければ厳密なDACLは分かりません。

本記事では、以上の2つのSDDLを例に用いて、SDDL文字列の解読方法を解説します。

SDDL文字列の解読

ルートディレクトリから取得したSDDL文字列の例

まずは、前節で最初に示した以下のSDDLを例に解説します。

O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:SYD:PAI(A;;LC;;;AU)(A;OICIIO;SDGXGWGR;;;AU)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)

このSDDLがSecurity Descriptorの情報と等価な情報を表現する文字列であり、それぞれの要素が OwnerGroupSaclDacl の情報に対応しているわけですが、初見だとどこで区切れば良いのか分かりにくいです。 SDDLでは、Owner 情報は O:Group 情報は G:Sacl 情報は S:Dacl 情報は D: で始まります。 つまり、例示しているSDDLを各情報毎に改行すると以下のようになります(Sacl は定義されていません)。

// Owner
O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464
// Group
G:SY
// Dacl
D:PAI(A;;LC;;;AU)(A;OICIIO;SDGXGWGR;;;AU)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)

SECURITY_DESCRIPTOR 構造体についての解説を踏まえると、Owner 情報と Group 情報にはアカウントのSID情報が指定されるため、: に続く文字列はアカウントを示しています。 Owner 情報に設定されているアカウントは、S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464 というSID文字列として表示されていますが、これは NT SERVICE\TrustedInstaller と呼ばれるWindows OSでは特別な意味を持つ特権アカウントのSIDです。 つまり、O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464 というSDDL文字列は「このオブジェクトの所有者アカウントは NT SERVICE\TrustedInstaller である」という情報を表現しています。

では、G: に続く SY は何を示しているのでしょうか? SDDLでは、Windows OSにデフォルトで共通して存在する一部のアカウントは、事前に定義されたアルファベット2文字の語句で表現されます。 事前に定義されている代表的なアカウントを以下の表に示します。

SDDL文字列 アカウント名
AN NT AUTHORITY\ANONYMOUS LOGON
AU NT AUTHORITY\Authenticated Users
BA BUILTIN\Administrators
BG BUILTIN\Guests
BU BUILTIN\Users
CO CREATOR OWNER
DA Domain Admins
DG GuestActive Directoryドメイン用)
DU Domain Users
EA Enterprise Admins
WD Everyone
IU NT AUTHORITY\INTERACTIVE
LA ビルトイン管理者
LG Guest(ローカル端末用)
LS NT AUTHORITY\LOCAL SERVICE
SY NT AUTHORITY\SYSTEM
NU NT AUTHORITY\NETWORK
NS NT AUTHORITY\NETWORK SERVICE
PU BUILTIN\Power Users
RD BUILTIN\Remote Desktop Users

SYNT AUTHORITY\SYSTEM です。 よって、G:SY というSDDL文字列は「このオブジェクトのプライマリグループアカウントは NT AUTHORITY\SYSTEM である」という情報を示しています。

SaclDaclACLの定義であるため、SDDL文字列の書式は同じです。 書式は以下に従います。

<DまたはS>:(<ACE文字列1>)(<ACE文字列2>)......(<ACE文字列N>)

例示しているSDDL文字列には、D:(A;;LC;;;AU) の間に PAI という文字列が存在していますが、この文字列についてはあまり重要でないため無視して問題ありません。

ACE文字列に関しては、以下の書式に従います。

<ACEタイプ>;<ACEフラグ>;<アクセス権限>;<オブジェクトのGUID>;<継承オブジェクトのGUID>;<アカウント>

ACEタイプのフィールドには、許可リストか拒否リストかを示す文字列が設定され、A(Allowd、許可)か D(Denied、拒否)のどちらかです。 ほとんどの場合は許可リスト形式のACEでACLを構築するため、A が指定されます。

ACEフラグのフィールドには、ACEの性質を示す情報が設定されます。 本記事が意図している範囲を超える話題であるため、詳しい解説は割愛します。

アクセス権限のフィールドには、権限のAccess Mask情報が設定されます。 Generic Right、Standard Rightをはじめとする適用範囲が広い権限については、以下の表に示す事前に定義されたアルファベット2文字の語句で表現されます。 これらの文字列で表現できない場合は、16進数の形式でAccess Maskが表示されます。

SDDL文字列 権限名
GA GENERIC_ALL
GR GENERIC_READ
GW GENERIC_WRITE
GX GENERIC_EXECUTE
RC READ_CONTROL
SD DELETE
WD WRITE_DAC
WO WRITE_OWNER
RP READ_PROPERTY
WP WRITE_PROPERTY
CC CREATE_CHILD
DC DELETE_CHILD
LC LIST_CHILDREN
SW SELF_WRITE
LO LIST_OBJECT
DT DELETE_TREE
CR CONTROL_ACCESS

また、Active DirectoryのオブジェクトのACEの場合は、アクセス権限を示す文字列として以下の文字列が定義されています。

SDDL文字列 権限名 概要
RP READ_PROPERTY 属性値の読み取り権限
WP WRITE_PROPERTY 属性値の書き込み権限
CC CREATE_CHILD 子オブジェクトの作成権限
DC DELETE_CHILD 子オブジェクトの削除権限
LC LIST_CHILDREN 子オブジェクトの列挙権限
SW SELF_WRITE 書き込み権限を制御するための権限
LO LIST_OBJECT オブジェクト情報の列挙権限
DT DELETE_TREE 子オブジェクトの一括削除権限
CR CONTROL_ACCESS 拡張アクセス権によって制御される操作の実行権限

ファイルやプロセスなどの一般的なオブジェクトは、32 bitのAccess Maskで十分に権限が表現できますが、Active Directoryのオブジェクトは、例えば「ユーザアカウントのパスワードを変更する権限」や「グループにユーザアカウントを追加する権限」などのような、32 bitのAccess Maskでは表現できない権限を処理できなければなりません。 以下のスクリーンショットは、Active Directoryのオブジェクトの設定画面を示しています。 32個では収まらない数の権限が定義されていることが確認できるでしょう。

Active DirectoryオブジェクトのDACL

オブジェクトのGUIDと継承オブジェクトのGUIDのフィールドに関しては、あまり深く解説しませんが、Access Maskだけでは表現できない特殊な権限などを示すGUIDが設定されます。 最後のアカウント情報のフィールドは、所有者情報などと同様に、アカウントを示す事前定義された文字列かSID文字列が設定されます。

では、ここまでの内容を踏まえて、(A;;LC;;;AU)(A;OICIIO;SDGXGWGR;;;AU)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU) というSDDL文字列を解読してみましょう。 まず (A;;LC;;;AU) については以下の表のように解読できます。

フィールド名 設定値
ACEタイプ 許可リスト(A
ACEフラグ -
アクセス権限 LIST_CHILDREN(LC
オブジェクトのGUID -
継承オブジェクトのGUID -
アカウント NT AUTHORITY\Authenticated UsersAU

例に用いているSDDL文字列は C:\ ディレクトリに設定されているSecurity Descriptorを示すものでした。 つまり、このACE文字列は「端末のログオンに成功した全てのアカウント(NT AUTHORITY\Authenticated Users)は、C:\ 直下のオブジェクトを列挙できる」という意味になります。 同じ要領で解読すると、(A;OICIIO;SDGXGWGR;;;AU) というACE文字列は「NT AUTHORITY\Authenticated Users にDELETE、GENERIC_EXECUTE、GENERIC_WRITE、GENERIC_READ権限を許可するACE」であると分かります。

最後のACEはアクセス権限が 0x1200a9 と表示されているため、事前に定義されている文字列では表現ができないアクセス権限が設定されています。 この場合は、SDDL文字列の取得もとであるオブジェクトに対応するAccess Maskの意味を調べなければなりません。 例に用いているSDDL文字列は C:\ ディレクトリのものであるため、ディレクトリからアクセス権限を取得するために用いるWindows APIであるCreateFile APIのMicrosoft公式文書を調べてみましょう。 調べてみると、FILE_GENERIC_READ(0x00120089)とFILE_EXECUTE (0x00000020)の値をOR演算すると0x1200a9 であるため、0x1200a9 というAccess Maskはファイルの読み取り権限と実行権限を示しているとわかります。

Active Directoryから取得したSDDL文字列の例

続けて、Active Directoryから取得した以下のSDDL文字列について解説します。

O:DAG:DAD:AI(A;;CCDC;;;PS)(A;;LCRPLORC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;AO)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;DA)(OA;;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;;WD)(OA;;RPWP;77b5b886-944a-11d1-aebd-0000f80367c1;;PS)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;PS)(OA;;SW;72e39547-7b18-11d1-adef-00c04fd8d5cd;;PS)(OA;;CCDC;bf967aa8-0de6-11d0-a285-00aa003049e2;;PO)(OA;;RP;46a9b11d-60ae-405a-b7e8-ff8a58d456d2;;S-1-5-32-560)(OA;;WP;bf967953-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;WP;4c164200-20c0-11d0-a768-00aa006e0529;;DA)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;DA)(OA;;SW;72e39547-7b18-11d1-adef-00c04fd8d5cd;;DA)(OA;;WP;3e0abfd0-126a-11d0-a060-00aa006c33ed;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;WP;bf967950-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;WP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967a86-0de6-11d0-a285-00aa003049e2;DA)(OA;;RPWP;bf967a7f-0de6-11d0-a285-00aa003049e2;;CA)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIID;RPWP;5b47d60f-6090-40b2-9f37-2a4de88f3063;;S-1-5-21-3654360273-254804765-2004310818-526)(OA;CIID;RPWP;5b47d60f-6090-40b2-9f37-2a4de88f3063;;S-1-5-21-3654360273-254804765-2004310818-527)(OA;ID;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;;DA)(OA;CIIOID;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;CIID;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;bf967a86-0de6-11d0-a285-00aa003049e2;PS)(OA;CIID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIID;WP;ea1b7b93-5e48-46d5-bc6c-4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)(OA;CIIOID;LCRPLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;LCRPLORC;;bf967a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;LCRPLORC;;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;OICIID;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(A;CIID;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3654360273-254804765-2004310818-519)(A;CIID;LC;;;RU)(A;CIID;CCLCSWRPWPLOCRSDRCWDWO;;;BA)

解読方法については C:\ から取得したSDDL文字列の例と大差ないため、違う部分だけ解説します。 例として (OA;;WP;bf967953-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;DA) を取り上げます。

まずはACEタイプを示す OA です。 ACEタイプについては、Microsoft公式文書のACE文字列のページの「フィールド」の項目から確認できます。 文書によると、SDDL_OBJECT_ACCESS_ALLOWEDというACEタイプを示す文字列ですが、要するに「Active Directoryのオブジェクトについてのアクセス許可エントリである」ということです。

アクセス権限のフィールドには WP が設定されています。 これは先述の通り、Write Property、つまりは属性値の書き込み権限を示しています。 何の属性値かというのは、次のフィールドに設定されているGUIDから判断できます。

続けて、先ほどの C:\ の例とは異なり、オブジェクトのGUIDと継承オブジェクトのGUIDのフィールドが埋まっています。 この場合は、これらのGUIDが何を意味するのかを調べなければなりません。 GUIDを抜き出して、Googleなどの検索エンジンでそのまま検索に掛けると、Microsoftの公式文書などの情報が確認できます。 Active Directoryに関連するオブジェクトであれば、Microsoft公式文書のクラス (AD スキーマ)のページから、オブジェクトを示すGUIDが調べられます。

GUID 意味 概要
bf967953-0de6-11d0-a285-00aa003049e2 Display-Name属性 表示名を設定するための属性。
bf967a86-0de6-11d0-a285-00aa003049e2 Computerオブジェクト 適用対象のオブジェクトがComputerである。

最後に、アカウント情報のフィールドの DA ですが、これは先述の通り Domain Admins グループを示しています。

まとめると、この (OA;;WP;bf967953-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;DA) というACE文字列は、「Domain Admins グループに所属するアカウントは、このACEが設定されているコンピュータアカウント(この例の場合は CL01)のオブジェクトの表示名の変更が許可されている」という意味です。

ツールによる確認例

Security DescriptorやSDDLなどについて理解できたところで、実際にアクセス権限を確認するツールの使用方法を把握しておきましょう。

icacls.exe

icacls.exeは、Microsoft Windows OSでファイルの権限を管理するために、標準インストールされているコマンドラインツールです。 引数に単にファイル名を指定すれば、以下のようにアクセス権限(DACL)が確認できます。

PS C:\> icacls.exe C:\Windows\System32\kernel32.dll
C:\Windows\System32\kernel32.dll NT SERVICE\TrustedInstaller:F
                                 BUILTIN\Administrators:R
                                 NT AUTHORITY\SYSTEM:R
                                 BUILTIN\Users:R
                                 APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:R
                                 APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:R

アカウント名に続けて、: を挟んで、与えられている権限が文字列として表示されています。 これらの値の意味はicacls.exeのヘルプメッセージ(icacls.exe /? と実行)から確認できます。 以上の例の場合は、F は全権限、R は読み取り権限を示しています。 DACLをSDDL文字列として確認したい場合は、以下のように /save オプションでファイルとして出力します。

PS C:\> icacls C:\Windows\System32\kernel32.dll /save sddl-kernel32.txt
processed file: C:\Windows\System32\kernel32.dll
Successfully processed 1 files; Failed processing 0 files

PS C:\> type .\sddl-kernel32.txt
kernel32.dll

D:PAI(A;;FA;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;;0x1200a9;;;BA)(A;;0x1200a9;;;SY)(A;;0x1200a9;;;BU)(A;;0x1200a9;;;AC)(A;;0x1200a9;;;S-1-15-2-2)S:AI

accesschk.exe

Microsoft Windows OSに標準インストールされているツールではありませんが、Microsoft公式の開発者向けツールであるSysinternals Suiteaccesschk.exeでは、DACL以外のSecurity Descriptor情報が確認できます。 Sysinternals Suiteは、Microsoft公式ページの他にも、Microsoft Storeアプリ経由でもインストール可能です。

accesschk.exeの引数に単にファイル名を指定して実行した場合は、icacls.exeの場合と同様に、簡略化された形式のDACL情報が出力されます。

PS C:\> accesschk.exe C:\WIndows\System32\kernel32.dll

Accesschk v6.15 - Reports effective permissions for securable objects
Copyright (C) 2006-2022 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\WIndows\System32\kernel32.dll
  RW NT SERVICE\TrustedInstaller
  R  BUILTIN\Administrators
  R  NT AUTHORITY\SYSTEM
  R  BUILTIN\Users
  R  APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES
  R  APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES

-L フラグを設定すると、DACL情報のみではなく、所有者情報とSACL情報を含んだSDDL文字列が出力されます(プライマリグループ情報が出力されていないのは、実際には使用されない情報であるからと考えられます)。

PS C:\> accesschk.exe -L C:\Windows\System32\kernel32.dll

Accesschk v6.15 - Reports effective permissions for securable objects
Copyright (C) 2006-2022 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\Windows\System32\kernel32.dll
  O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:PAI(A;;FA;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;;0x1200a9;;;BA)(A;;0x1200a9;;;SY)(A;;0x1200a9;;;BU)(A;;0x1200a9;;;AC)(A;;0x1200a9;;;S-1-15-2-2)S:AI

sc.exe

sc.exeは、サービスを管理(Service Control)するための、Microsoft Windows OSに標準インストールされているコマンドラインツールです。 sdshow オプションを用いると、サービスに設定されたDACL情報(サービス制御権限)が確認できます。 以下の例は、Microsoft DefenderのサービスのDACL情報をSDDL文字列として確認した際の例です。 cmd.exeから実行する場合は sc と実行して問題ありませんが、PowerShellから実行する場合は scSet-Content コマンドレットにエイリアスされているため、sc.exe と実行しなければならない点に注意してください。

PS C:\> sc.exe sdshow windefend

D:(A;;CCLCSWRPLOCRRC;;;BU)(A;;CCLCSWRPLOCRRC;;;SY)(A;;CCLCSWRPLOCRRC;;;BA)(A;;CCLCSWRPLOCRRC;;;IU)(A;;CCLCSWRPLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-1913148863-3492339771-4165695881-2087618961-4109116736)

アクセス権限を示すフィールドの値は、サービスの場合は別の意味が設定されているため注意が必要です。 アクセス権限の意味を調べたい場合は、以上の sc.exe の最後に showrights オプションを指定します。

PS C:\> sc.exe sdshow windefend showrights

D:(A;;CCLCSWRPLOCRRC;;;BU)(A;;CCLCSWRPLOCRRC;;;SY)(A;;CCLCSWRPLOCRRC;;;BA)(A;;CCLCSWRPLOCRRC;;;IU)(A;;CCLCSWRPLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-1913148863-3492339771-4165695881-2087618961-4109116736)

SDDL right       Right value
----------       -----------
   GA        -   GENERIC_ALL
   GR        -   GENERIC_READ
   GW        -   GENERIC_WRITE
   GX        -   GENERIC_EXECUTE
   RC        -   READ_CONTROL
   SD        -   DELETE
   WD        -   WRITE_DAC
   WO        -   WRITE_OWNER
   RP        -   SERVICE_START
   WP        -   SERVICE_STOP
   CC        -   SERVICE_QUERY_CONFIG
   DC        -   SERVICE_CHANGE_CONFIG
   LC        -   SERVICE_QUERY_STATUS
   SW        -   SERVICE_ENUMERATE_DEPENDENTS
   LO        -   SERVICE_INTERROGATE
   DT        -   SERVICE_PAUSE_CONTINUE
   CR        -   SERVICE_USER_DEFINED_CONTROL

例えば RP は、通常の場合は「属性値の読み取り権限(READ_PROPERTY)」という意味で用いられますが、サービスに関しては「サービスの起動権限(SERVICE_START)」という意味で用いられていることが確認できます。 それぞれの意味を、以下の表にまとめます。

SDDL文字列 サービスでの権限名 概要
RP SERVICE_START サービスの開始権限
WP SERVICE_STOP サービスの停止権限
CC SERVICE_QUERY_CONFIG サービスの設定確認権限
DC SERVICE_CHANGE_CONFIG サービスの設定変更権限
LC SERVICE_QUERY_STATUS サービスの状態確認権限
SW SERVICE_ENUMERATE_DEPENDENTS 対象サービスに依存するサービス情報の列挙権限
LO SERVICE_INTERROGATE サービスへの状態の報告権限
DT SERVICE_PAUSE_CONTINUE サービスの一時停止と再開権限
CR SERVICE_USER_DEFINED_CONTROL ユーザ定義の制御コードの指定権限

まとめ

Microsoft Windows OSでは、その豊富な機能のため、アクセス権限の不備が、権限昇格の脆弱性などの大きな問題につながる可能性があります。 アクセス権限をしっかり管理できる技術を身につけると、権限設定の不備を特定してMicrosoft Windows OSのセキュリティを強固なものにできます。

Security Descriptor、ACL、SDDL文字列などに関してより詳しい知識が欲しい人は、以下の文献を読むと良いでしょう。