「ケイパビリティ」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→nethogs: === wavemon === を追加(英語版より)) |
(同期) |
||
1行目: | 1行目: | ||
[[Category:セキュリティ]] |
[[Category:セキュリティ]] |
||
[[en:Capabilities]] |
[[en:Capabilities]] |
||
+ | [[pt:Capabilities]] |
||
+ | [[ru:Capabilities]] |
||
[[zh-hans:Capabilities]] |
[[zh-hans:Capabilities]] |
||
− | + | ケイパビリティ (POSIX 1003.1e, {{man|7|capabilities}}) はスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者は、システムバイナリの強力な [[wikipedia:ja:Setuid|setuid]] 属性を、より最低限のケイパビリティのセットに置き換えることが推奨されています。多数のパッケージがケイパビリティを利用しており、例えば {{ic|CAP_NET_RAW}} は {{Pkg|fping}} バイナリで使われています。これによって ('''setuid''' と同じように) 通常ユーザーで {{ic|fping}} を実行することができ、それと同時に、{{ic|fping}} に脆弱性があった場合のセキュリティ上の影響を緩和することができます。 |
|
− | |||
− | == 要件 == |
||
− | |||
− | ''setcap'' ユーティリティを使って、拡張属性であるファイルケイパビリティを設定するには {{Pkg|libcap}} を[[pacman|インストール]]する必要があります。 |
||
== 実装 == |
== 実装 == |
||
− | Linux ではケイパビリティは |
+ | Linux ではケイパビリティは[[拡張属性]] ({{man|7|xattr}}) の ''security'' 名前空間を使って実装されています。拡張属性は Ext2、Ext3、Ext4、Btrfs、JFS、XFS、そして Reiserfs など全ての主要な Linux [[ファイルシステム]]でサポートされています。以下の例では {{ic|getcap}} を使って fping のケイパビリティを出力し、さらに {{ic|getfattr}} を使ってエンコードされた同じデータを出力しています: |
− | {{hc|$ getcap /usr/bin/ |
+ | {{hc|$ getcap /usr/bin/fping|2= |
− | /usr/bin/ |
+ | /usr/bin/fping cap_net_raw=ep |
}} |
}} |
||
− | {{hc|$ getfattr -d -m "^security\\." /usr/bin/ |
+ | {{hc|$ getfattr -d -m "^security\\." /usr/bin/fping|2= |
− | # file: usr/bin/ |
+ | # file: usr/bin/fping |
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA= |
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA= |
||
}} |
}} |
||
23行目: | 21行目: | ||
{{ic|cp -a}} を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: {{ic|rsync -X}}。 |
{{ic|cp -a}} を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: {{ic|rsync -X}}。 |
||
− | ケイパビリティは |
+ | Arch ではケイパビリティはパッケージのインストールスクリプトによって設定されます (例: {{ic|fping.install}})。 |
== 管理とメンテナンス == |
== 管理とメンテナンス == |
||
− | パッケージ |
+ | パッケージが過度に強力なケイパビリティを持っている場合はバグと考えられます。なので、ここに記載するのではなくバグとして報告してください。Arch は [[セキュリティ#強制アクセス制御|MAC/RBAC]] システムをサポートしていないため、root アクセスと本質的に等価なケイパビリティ ({{ic|CAP_SYS_ADMIN}}) や root アクセスを容易にするケイパビリティ ({{ic|CAP_DAC_OVERRIDE}}) はバグではありません。 |
− | {{Warning|特権昇格が可能になるケイパビリティは多数あります。詳しい例や説明は Brad Spengler による [ |
+ | {{Warning|特権昇格が可能になるケイパビリティは多数あります。詳しい例や説明は Brad Spengler による [https://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271 False Boundaries and Arbitrary Code Execution] を参照してください。}} |
== ケイパビリティを利用できる他のプログラム == |
== ケイパビリティを利用できる他のプログラム == |
||
以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。 |
以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。 |
||
+ | |||
+ | ケイパビリティの末尾の {{ic|+ep}} は "実効許可 (effective permitted)" を意味します。詳細は {{man|7|capabilities|File capabilities}} で見られます。 |
||
=== beep === |
=== beep === |
||
66行目: | 66行目: | ||
setuid-root ファイルを検索: |
setuid-root ファイルを検索: |
||
+ | |||
$ find /usr/bin /usr/lib -perm /4000 -user root |
$ find /usr/bin /usr/lib -perm /4000 -user root |
||
setgid-root ファイルを検索: |
setgid-root ファイルを検索: |
||
+ | |||
$ find /usr/bin /usr/lib -perm /2000 -group root |
$ find /usr/bin /usr/lib -perm /2000 -group root |
||
+ | |||
+ | == ケイパビリティを一時的に付与してプログラムを実行する == |
||
+ | |||
+ | {{man|1|capsh}} を使うと、バイナリの拡張属性を変更せずに、特定のケイパビリティを持たせてプログラムを実行することができます。 |
||
+ | 以下の例では、{{ic|CAP_SYS_PTRACE}} ケイパビリティを使って、[[GDB]] を使ってプロセスにアタッチする方法を示しています: |
||
+ | |||
+ | $ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid> |
||
+ | |||
+ | [[netcat]] を使って低いポートにバインドする例: |
||
+ | |||
+ | $ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123 |
||
+ | Listening on 0.0.0.0 123 |
||
== 参照 == |
== 参照 == |
||
− | * Man ページ: {{man|7|capabilities}} |
+ | * Man ページ: {{man|7|capabilities}}、{{man|8|setcap}}、{{man|8|getcap}} |
− | * [ |
+ | * [[Wikibooks:Grsecurity/Appendix/Capability Names and Descriptions]] |
− | * [https:// |
+ | * [https://docs.kernel.org/userspace-api/seccomp_filter.html Seccomp BPF (SECure COMPuting with filters)] |
+ | |||
+ | {{TranslationStatus|Capabilities|2023-05-11|760131}} |
2023年5月11日 (木) 20:59時点における版
ケイパビリティ (POSIX 1003.1e, capabilities(7)) はスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者は、システムバイナリの強力な setuid 属性を、より最低限のケイパビリティのセットに置き換えることが推奨されています。多数のパッケージがケイパビリティを利用しており、例えば CAP_NET_RAW
は fping バイナリで使われています。これによって (setuid と同じように) 通常ユーザーで fping
を実行することができ、それと同時に、fping
に脆弱性があった場合のセキュリティ上の影響を緩和することができます。
目次
実装
Linux ではケイパビリティは拡張属性 (xattr(7)) の security 名前空間を使って実装されています。拡張属性は Ext2、Ext3、Ext4、Btrfs、JFS、XFS、そして Reiserfs など全ての主要な Linux ファイルシステムでサポートされています。以下の例では getcap
を使って fping のケイパビリティを出力し、さらに getfattr
を使ってエンコードされた同じデータを出力しています:
$ getcap /usr/bin/fping
/usr/bin/fping cap_net_raw=ep
$ getfattr -d -m "^security\\." /usr/bin/fping
# file: usr/bin/fping security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
cp -a
を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: rsync -X
。
Arch ではケイパビリティはパッケージのインストールスクリプトによって設定されます (例: fping.install
)。
管理とメンテナンス
パッケージが過度に強力なケイパビリティを持っている場合はバグと考えられます。なので、ここに記載するのではなくバグとして報告してください。Arch は MAC/RBAC システムをサポートしていないため、root アクセスと本質的に等価なケイパビリティ (CAP_SYS_ADMIN
) や root アクセスを容易にするケイパビリティ (CAP_DAC_OVERRIDE
) はバグではありません。
ケイパビリティを利用できる他のプログラム
以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。
ケイパビリティの末尾の +ep
は "実効許可 (effective permitted)" を意味します。詳細は capabilities(7) § File capabilities で見られます。
beep
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
chvt
# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
iftop
# setcap cap_net_raw+ep /usr/bin/iftop
mii-tool
# setcap cap_net_admin+ep /usr/bin/mii-tool
mtr
# setcap cap_net_raw+ep /usr/bin/mtr-packet
nethogs
# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
wavemon
# setcap cap_net_admin+ep /usr/bin/wavemon
便利なコマンド
setuid-root ファイルを検索:
$ find /usr/bin /usr/lib -perm /4000 -user root
setgid-root ファイルを検索:
$ find /usr/bin /usr/lib -perm /2000 -group root
ケイパビリティを一時的に付与してプログラムを実行する
capsh(1) を使うと、バイナリの拡張属性を変更せずに、特定のケイパビリティを持たせてプログラムを実行することができます。
以下の例では、CAP_SYS_PTRACE
ケイパビリティを使って、GDB を使ってプロセスにアタッチする方法を示しています:
$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>
netcat を使って低いポートにバインドする例:
$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123 Listening on 0.0.0.0 123