๋ฆฌ๋
์ค ์ปค๋์ LSM ํํฌ๋ ๋จ์ผ ํจ์ ํฌ์ธํฐ๊ฐ ์๋ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(hlist_head)๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
๋ณด์ ๊ฒ์ฌ ์์ฒญ ๋ฐ์ ์ ์ฒด์ธ์ ๋ฑ๋ก๋ ๋ชจ๋๋ค์ด ์์ฐจ์ ์ผ๋ก ํธ์ถ๋๋ฉฐ, ์ด๋ ํ ๋ชจ๋์ด๋ผ๋ ์์ ์๋ฌ(-EPERM, -EACCES)๋ฅผ ๋ฐํํ๋ฉด ์ฆ์ ๊ฑฐ๋ถ(Fail-Closed)๋๊ณ ํ์ ํ๊ฐ๋ ์ค๋จ๋ฉ๋๋ค.
/* include/linux/lsm_hook_defs.h */
#define call_int_hook(FUNC, IRC, ...) ({ \
int RC = IRC; \
struct security_hook_list *P; \
hlist_for_each_entry(P, &security_hook_heads.FUNC, list) { \
RC = P->hook.FUNC(__VA_ARGS__); \
if (RC != 0) \
break; /* Fail-Closed! ์ฆ์ ์ค๋จ */ \
} \
RC; \
})
์ฒด์ธ์ ๋ฑ๋ก๋ ๋ชจ๋ LSM์ด 0(์ฑ๊ณต)์ ๋ฐํํด์ผ๋ง ์ ๊ทผ์ด ์ต์ข
ํ์ฉ๋ฉ๋๋ค. ์ด๋ ํ๋๋ผ๋ 0์ด ์๋ ๊ฐ์ ๋ฐํํ๋ฉด ๊ทธ ์ฆ์ ๋ฃจํ๊ฐ break๋์ด ํ์ ๋ชจ๋์ ํ๊ฐ๋์ง ์์ต๋๋ค.
๋ฆฌ๋
์ค 5.1 ์ด์ ์๋ ๋ชจ๋๋ง๋ค void *security ํฌ์ธํฐ๋ฅผ ๋
์ ํ๋ ค ํ์ฌ ๋ณต์ LSM ๋์ ํ์ฑํ๊ฐ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
ํ๋ ์คํํ LSM์ ์ปค๋ ๋ถํ
์ ๊ฐ ๋ชจ๋์ด ์์ฒญํ ํฌ๊ธฐ(lsm_blob_sizes)๋ฅผ ํฉ์ฐํ์ฌ ๋จ์ผ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ผ๋ก ํ ๋นํ๊ณ , ๊ฐ ๋ชจ๋์ ๊ณ ์ ์คํ์
์ ์ ๊ณตํฉ๋๋ค.
struct lsm_blob_sizes {
int lbs_cred; /* Task credentials */
int lbs_file; /* Open file description */
int lbs_inode; /* Inode metadata */
int lbs_ipc; /* IPC objects */
int lbs_msg; /* SysV msg */
int lbs_task; /* Task struct */
int lbs_xattr; /* Security xattrs */
};
/* ์: Landlock ๋ชจ๋์ ๊ฐ์ธ ๋ธ๋กญ ์ ๊ทผ */
static inline struct landlock_ruleset *
landlock_cred(const struct cred *cred)
{
return (struct landlock_ruleset *)
(cred->security + landlock_blob_sizes.lbs_cred);
}
์ปค๋ ์ปดํ์ผ ์ CONFIG_LSM์ผ๋ก ๊ธฐ๋ณธ ์คํ์ ์ง์ ํ๊ณ , ๋ถํ
์ ์ปค๋ ๋ช
๋ น์ค์ lsm=... ํ๋ผ๋ฏธํฐ๋ก ์์ ๋ณ๊ฒฝ ๋ฐ ๋นํ์ฑํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์๋ ์
๋ ฅ๋์ ์ํ๋ lsm=... ํ๋ผ๋ฏธํฐ๋ฅผ ์
๋ ฅํ๊ณ ์ ์ฉํด ๋ณด์ญ์์ค.
capability,landlock,lockdown,yama,loadpin,safesetid,bpf
ํ์ฌ ํ์ฑํ๋ LSM ๋ชฉ๋ก์ด ์ปด๋ง๋ก ๊ตฌ๋ถ๋์ด ์ ์ ์คํ์ด์ค์ ๋ ธ์ถ๋ฉ๋๋ค.
syscall(461, ids, &size, 0)
-> Detected Modules:
[1] ID: 100 (capability)
[2] ID: 110 (landlock)
[3] ID: 108 (lockdown)
[4] ID: 105 (yama)
[5] ID: 106 (loadpin)
[6] ID: 107 (safesetid)
[7] ID: 109 (bpf)
๋ฆฌ๋ ์ค 6.8์ ์ถ๊ฐ๋ UAPI ์์คํ ์ฝ๋ก ๋ฐ์ด๋๋ฆฌ ID ๋ชฉ๋ก์ ์์ ํ๊ฒ ์ง์ํฉ๋๋ค.
| ๋ชจ๋๋ช (LSM) | ๋์ ๋ฒ์ | ์คํ ์ง์ | ๋นํน๊ถ์ ์ฌ์ฉ | ์ฃผ์ ๋ฐฉ์ด ์์ญ ๋ฐ ๋ฉ์ปค๋์ฆ | ๋ธ๋กญ ์๊ตฌ |
|---|---|---|---|---|---|
| Capability | 2.6.0 (ํ์) | ํญ์ 1์์ | ๊ถํ ์์ | ์ ํต์ POSIX capability ๋ฐ DAC ๊ถํ ๊ฒ์ฌ (๋ฃจํธ ๋ถํ ) | 0 bytes |
| Landlock | 5.13 | ์คํ ๊ฐ๋ฅ | ์์ ์ง์ | ๋นํน๊ถ ํ๋ก์ธ์ค ์๋๋ฐ์ฑ (ํ์ผ์์คํ ๊ฒฝ๋ก ๋ฐ ๋คํธ์ํฌ ํฌํธ ์ ํ) | Cred, Inode |
| Lockdown | 5.4 | ์คํ ๊ฐ๋ฅ | ๋ฃจํธ ์ ์ฉ | ์ปค๋ ๋ฌด๊ฒฐ์ฑ ๋ฐ ๊ธฐ๋ฐ์ฑ ๋ณดํธ (/dev/mem, I/O ํฌํธ, BPF ์ฐ๊ธฐ ๋ฐฉ์ง) | 0 bytes |
| Yama | 3.4 | ์คํ ๊ฐ๋ฅ | ๊ธฐ๋ณธ ๋ณดํธ | ptrace ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๋ฐ ๋๋ฒ๊น ์ ๊ทผ ํต์ (ptrace_scope) | 0 bytes |
| LoadPin | 4.7 | ์คํ ๊ฐ๋ฅ | ๋ถํ ์ ์ฉ | ์ปค๋ ๋ชจ๋/ํ์จ์ด๊ฐ ์ต์ด ๋ง์ดํธ๋ ์ ๋ขฐ ๋ฃจํธ์์๋ง ๋ก๋๋๋๋ก ๊ณ ์ | 0 bytes |
| SafeSetID | 5.1 | ์คํ ๊ฐ๋ฅ | ๋ฃจํธ ์ ์ฑ | UID/GID ์ ํ ์ ์ด(Transition) ๊ท์น ํต์ (๊ถํ ์์น ํต๋ก ์ ํ) | Cred |
| BPF LSM | 5.7 | ์คํ ๊ฐ๋ฅ | CAP_BPF | eBPF ํ๋ก๊ทธ๋จ์ ํตํ ๋์ ๋ฐํ์ ๋ณด์ ์ ์ฑ ์ฃผ์ ๋ฐ ๋ชจ๋ํฐ๋ง | Dynamic |
| SELinux / AppArmor | 2.6.0 / 2.6.36 | ๋จ์ผ ์ฃผ ๋ชจ๋ | ๊ด๋ฆฌ์ ์ ์ฑ | ์์คํ ์ ์ญ ๊ฐ์ ์ ์ ๊ทผ ์ ์ด (MAC - ๋ ์ด๋ธ ๋ฐ ๊ฒฝ๋ก ๊ธฐ๋ฐ) | Full Blobs |