μ μλ μ΄μ§ νΈλ¦¬ μ±λ₯ ν₯μμ ν μ€νΈνκΈ° μν΄ read() λ° λ²νΌ ν¬κΈ° μΈμ(A2)μ λν λΉνμ€μ μΈ κ·μΉ μ§ν©μ μμ±νμ΅λλ€. κ·Έλ¬λ μ μ΄λ μ΄ ν μ€νΈ μΌμ΄μ€μμλ src/db.c μ¬μμ 컀λ°(ce3dda9a1)μ΄ A2 μ²λ¦¬λ₯Ό μ€λ¨ν κ²μΌλ‘ 보μ λλ€.
db μ¬μμ
μ»€λ° μ μ read(devzero_fd, buf, 8000)
μ κ°μ μ½κΈ°κ° -10
λ°ννμ΅λλ€. μ΄ μ»€λ° νμλ μ΄μ -5
λ°νν©λλ€.
λ€μμ μ΄λ¦¬μμ read() κ·μΉμ μμ±νλ λ° μ¬μ©ν C μ½λμ λλ€.
/* read */
for (i = 5; i <= 12; i++) {
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(i), SCMP_SYS(read), 1,
SCMP_A2(SCMP_CMP_GT, 4 << i));
if (rc < 0) {
fprintf(stdout, "%s:%d Failed to add read rule %d : rc = %d\n",
__FUNCTION__, __LINE__, i, rc);
goto error;
}
}
rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1,
SCMP_A2(SCMP_CMP_LE, 64));
if (rc < 0) {
fprintf(stdout, "%s:%d Failed to add read allow rule : rc = %d\n",
__FUNCTION__, __LINE__, rc);
goto error;
}
μμ±ν PFCλ λ€μκ³Ό κ°μ΅λλ€.
# filter for syscall "read" (0) [priority: 65525]
if ($syscall == 0)
if ($a2.hi32 >= 0)
if ($a2.lo32 > 64)
else
action ALLOW;
if ($a2.lo32 > 16384)
action ERRNO(12);
if ($a2.lo32 > 8192)
action ERRNO(11);
if ($a2.lo32 > 4096)
action ERRNO(10);
if ($a2.lo32 > 2048)
action ERRNO(9);
if ($a2.lo32 > 1024)
action ERRNO(8);
if ($a2.lo32 > 512)
action ERRNO(7);
if ($a2.lo32 > 256)
action ERRNO(6);
if ($a2.lo32 > 128)
action ERRNO(5);
else
action ALLOW;
# default action
action ERRNO(34);
그건 κ·Έλ κ³ , λλ κ·Όλ³Έ μμΈμ λκΈ° μν΄ λ΄κ° ν μμλ μΌμ ν κ²μ λλ€
scmp_bpf_disasmμ μ¬μ©νμ¬ μ΅μ libseccompκ° μ νλ₯Ό μλͺ»λ μμλ‘ λ°°μΉνκ³ μμ΅λλ€.
머리
0014: 0x25 0x11 0x00 0x00000080 jgt 128 true:0032 false:0015
0015: 0x25 0x0f 0x00 0x00000100 jgt 256 true:0031 false:0016
0016: 0x25 0x0d 0x00 0x00000200 jgt 512 true:0030 false:0017
0017: 0x25 0x0b 0x00 0x00000400 jgt 1024 true:0029 false:0018
0018: 0x25 0x09 0x00 0x00000800 jgt 2048 true:0028 false:0019
0019: 0x25 0x07 0x00 0x00001000 jgt 4096 true:0027 false:0020
0020: 0x25 0x05 0x00 0x00002000 jgt 8192 true:0026 false:0021
0021: 0x25 0x03 0x00 0x00004000 jgt 16384 true:0025 false:0022
0022: 0x25 0x01 0x00 0x00000040 jgt 64 true:0024 false:0023
0023: 0x06 0x00 0x00 0x7fff0000 ret ALLOW
μ¬μ μ¬μμ
0014: 0x25 0x01 0x00 0x00000040 jgt 64 true:0016 false:0015
0015: 0x06 0x00 0x00 0x7fff0000 ret ALLOW
0016: 0x25 0x0f 0x00 0x00004000 jgt 16384 true:0032 false:0017
0017: 0x25 0x0d 0x00 0x00002000 jgt 8192 true:0031 false:0018
0018: 0x25 0x0b 0x00 0x00001000 jgt 4096 true:0030 false:0019
0019: 0x25 0x09 0x00 0x00000800 jgt 2048 true:0029 false:0020
0020: 0x25 0x07 0x00 0x00000400 jgt 1024 true:0028 false:0021
0021: 0x25 0x05 0x00 0x00000200 jgt 512 true:0027 false:0022
0022: 0x25 0x03 0x00 0x00000100 jgt 256 true:0026 false:0023
0023: 0x25 0x01 0x00 0x00000080 jgt 128 true:0025 false:0024
0024: 0x06 0x00 0x00 0x00050022 ret ERRNO(34)
ν₯λ―Έλ‘μ΄. λ°λΌμ PFCλ "μ¬λ°λ₯Έ" κ²μ²λΌ 보μ΄μ§λ§ μμ±λ BPFλ ... κ±°κΎΈλ‘μ λλ€. μ΄μν. νΉν 컀λ°μ΄ BPF μμ± μ½λλ₯Ό λ³κ²½νμ§ μμλ€λ μ μ κ³ λ €νλ©΄.
μ°μ μμ κ°μ΄ μ΄λ»κ² λ μλ§μ΄λκ³ μλμ§ κΆκΈν©λλ€.
λͺ¨νΈν μ μ£μ‘ν©λλ€. PFC(μ¬μμ λ³κ²½ ν)λ μλͺ»λ μμμ λλ€. μμ κ²μν PFCλ db.c μ¬μμ μ΄μ μ μμμ λλ€.
HEADμμ νμ¬ μμ±ν PFCλ λ€μκ³Ό κ°μ΅λλ€.
# filter for syscall "read" (0) [priority: 65525]
if ($syscall == 0)
if ($a2.hi32 >= 0)
if ($a2.lo32 > 128)
action ERRNO(5);
if ($a2.lo32 > 256)
action ERRNO(6);
if ($a2.lo32 > 512)
action ERRNO(7);
if ($a2.lo32 > 1024)
action ERRNO(8);
if ($a2.lo32 > 2048)
action ERRNO(9);
if ($a2.lo32 > 4096)
action ERRNO(10);
if ($a2.lo32 > 8192)
action ERRNO(11);
if ($a2.lo32 > 16384)
action ERRNO(12);
if ($a2.lo32 > 64)
else
action ALLOW;
else
action ALLOW;
# default action
action ERRNO(34);
μκ² μ΅λλ€. μ‘°κΈ λ μλ―Έκ° μμ΅λλ€. λ¬Έμ λ νμ€ν db κ³μΈ΅μ μ΄λκ°μ μμ΅λλ€.
μ νν κ±°κΎΈλ‘ λ λͺ¨μ΅μ΄ μ’ μκΈ°λ€μ.
λ¬Έμ λ₯Ό μ°Ύμμ΅λλ€. μ²΄μΈ μΈμ κ΄λ¦¬μμ lvl_nxt λ° lvl_prvμ λμμ λκ·λͺ¨ db.c μ¬μμ ν κ΅μ²΄λμμ΅λλ€. _db_tree_add()μ λν λͺ κ°μ§ μμ λ³κ²½μΌλ‘ μ΄μ libseccomp λμκ³Ό μΌμΉνμ΅λλ€.
λ€μμ μμ μ¬νμ΄ μλ λΆκΈ°μ
λλ€.
https://github.com/drakenclimber/libseccomp/tree/issues/112
λ³κ²½ μ¬νμ μ 리νκ³ ν μ€νΈ νλ κ°λ₯Ό μΆκ°ν λ€μ μ½λ μ μ© λ²μκ° μ΅λ μμ€μΈμ§ νμΈν©λλ€.
μ€λ μμΉ¨, μλ§λ λΉμ μ΄ μμ κΈμ κ²μ νκΈ° μ§μ μ μκ°μ μ°Ύμκ³ , μ΄κ²μ μ‘°κΈ μ΄ν΄λ³΄κΈ°λ‘ κ²°μ νμ΅λλ€. μμ μ¬νμ μ½κ° λ€λ₯΄μ§λ§ κ±°μ λμΌν κ²°λ‘ μ λλ¬ν κ² κ°μ΅λλ€. κ·νμ λ§μ°¬κ°μ§λ‘ λͺ κ°μ§ μΆκ° μμ /μ λ¦¬κ° νμνμ§λ§ νμ¬ μμ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
μ§κΈμ μ΄λ€ μ κ·Ό λ°©μμ΄ λ λ§μμ λλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. μ΄ λΆλΆμ λν΄ μ’ λ μκ°ν΄λ΄μΌκ² μ£ ?
ν ... κ±°μ§λ§μ νμ§ μκ² μ΅λλ€. μ΄ μμ μμ λ κ°μ§ μμ μ¬νμ 맀νΉλμ§ μμ΅λλ€.
λ΄ κ²μ κ°λ¨νμ§λ§ _db_tree_prune()μ μμ ν 무μνμ΅λλ€. μμ μμ λ§νλ―μ΄ λΉμ·ν λ¬Έμ κ° μμ μ μμ΅λλ€.
lt() λ° eq() 맀ν¬λ‘λ₯Ό νμ©νκΈ° μν΄ gt() 맀ν¬λ‘λ₯Ό λ€μ μμ
νλ €λ λΉμ μ μμ΄λμ΄κ° λ§μμ λ€μ§λ§, νΉν lt()λ λ€λ£¨κΈ° μ΄λ €μμ§κ³ μμ΅λλ€. lt()λ₯Ό μΈλΌμΈ ν¨μλ‘ λ³ννμ§ μλ μ΄μ κ° μμ΅λκΉ?
νΈμ§ - λ°©κΈ λΉμ μ΄ μμ μμ λΉμ·ν μ견μ λ§ν κ²μ μμμ΅λλ€.
μ΄μ libseccomp λ° HEADμ λν΄ gdbλ₯Ό μ€ννκ³ lvl_prv λ° lvl_nxtμ λμμ΄ λ³κ²½λμμ§λ§ μ°λ¦¬ μΈμλ μ무λ λ³Ό μ μλ λ΄λΆ λ³μμ΄κΈ° λλ¬Έμ λ³ λ¬Έμ κ° λμ§ μμ μλ μμ΅λλ€.
μ΄ λ리λ₯Ό νΌμ΄ κ² κ°μλ°... μ λͺ¨λ₯΄κ² μ΅λλ€. λμν©λλ€, λλ κ·Έκ²μ λν΄ μκ°ν΄μΌν©λλ€ ;)
ν ... κ±°μ§λ§μ νμ§ μκ² μ΅λλ€. μ΄ μμ μμ λ κ°μ§ μμ μ¬νμ 맀νΉλμ§ μμ΅λλ€.
λλ μλ§λ μ΄μ 컀λ°μ μν΄ λ 벨 μ΄ μ¬μ λ ¬λ κ²μ²λΌ 보μ΄μ§λ§ μ΄κ²μ λ―Έλ¬ν λ²κ·Έ μ€ νλμ΄μ§λ§ μ΄μ κ°μ΄ νΈλ¦¬ μμ€μ μ¬μ λ ¬νλ λ° μ½κ°μ λ―Έλ¬ν λ²κ·Έκ° μλ κ²μ΄ κ±±μ λ©λλ€.
μ΄λ μͺ½μ΄λ , λ 벨μ λν΄ μνλ μμκ° λ¬΄μμΈμ§ μ΄ν΄νκ³ μΆμ΅λλ€. "κ°μ₯ ν°"μ΄ λ¨Όμ μ λκΉ, "κ°μ₯ ν°"μ΄ λ§μ§λ§μ λκΉ? μΌλ¨ μ΄ν΄νλ©΄ ν μ€νΈ/μμ μ μ§νν μ μμ΅λλ€. μ΄μ 2.x 릴리μ€μμ νΈνμ± μΈμ λ€λ₯Έ μ΄μ κ° μλ€λ©΄ "κ°μ₯ ν°" κ²μ΄ λ΅μ΄λΌκ³ μκ°ν©λλ€. νμ§λ§ νμ¬λ‘μλ νμ€ν λ§ν μ μμ΅λλ€.
λ΄ κ²μ κ°λ¨νμ§λ§ _db_tree_prune()μ μμ ν 무μνμ΅λλ€. μμ μμ λ§νλ―μ΄ λΉμ·ν λ¬Έμ κ° μμ μ μμ΅λλ€.
λ λ€ κΈ°λ³Έμ μΌλ‘ μμΉμ μΌλ‘ λμΌν μμ μ μνν©λλ€. μ κ²μ λͺ κ°μ§ μΆκ° 쑰건μ μΆκ°νκ³ db_chain_lt(x,y) 맀ν¬λ‘λ₯Ό μ 리νμ¬ μ‘°κΈ λ λμκ°λλ€.
lt() λ° eq() 맀ν¬λ‘λ₯Ό νμ©νκΈ° μν΄ gt() 맀ν¬λ‘λ₯Ό λ€μ μμ νλ €λ λΉμ μ μμ΄λμ΄κ° λ§μμ λ€μ§λ§, νΉν lt()λ λ€λ£¨κΈ° μ΄λ €μμ§κ³ μμ΅λλ€. lt()λ₯Ό μΈλΌμΈ ν¨μλ‘ λ³ννμ§ μλ μ΄μ κ° μμ΅λκΉ?
λλΆλΆ μμ¬μ μ΄μ . κ·Έλ€μ ν¨μ¬ λ λ¨μν 맀ν¬λ‘λ‘ μΆμ μμνμ§λ§, μλ§λ ν¨μκ° λμ΄μΌ νλ€κ³ μκ°νλ μ§μ κΉμ§ κ½€ μ±μ₯νμ΅λλ€. ν€λ νμΌμ μ λ§λ‘ μμ΄μΌ νλμ§ νκ°νλ κ²λ μ’μ κ²μ΄λΌκ³ μκ°ν©λλ€. src/db.cμμλ§ μ¬μ©λλ€κ³ μκ°ν©λλ€.
μ΄μ libseccomp λ° HEADμ λν΄ gdbλ₯Ό μ€ννκ³ lvl_prv λ° lvl_nxtμ λμμ΄ λ³κ²½λμμ§λ§ μ°λ¦¬ μΈμλ μ무λ λ³Ό μ μλ λ΄λΆ λ³μμ΄κΈ° λλ¬Έμ λ³ λ¬Έμ κ° λμ§ μμ μλ μμ΅λλ€.
λ€, λ΄λΆ μν/νΈλ¦¬μ λλ€. μ λ κ·Έκ²μ λν΄ λ³λ‘ κ±±μ νμ§ μμ΅λλ€. μ€μν κ²μ μμ±λ νν°μ μ νμ±μ λλ€.
μ΄ λ리λ₯Ό νΌμ΄ κ² κ°μλ°... μ λͺ¨λ₯΄κ² μ΅λλ€. λμν©λλ€, λλ κ·Έκ²μ λν΄ μκ°ν΄μΌν©λλ€ ;)
ν€. ν루λ μ΄ν μ λ μκ°μ λκ³ λ€μ κ·Έλ£Ήνν©μλ€. :) μ§κΈμ 릴리μ€λ λ²μ μ μν₯μ μ£Όμ§ μκ³ λ§μ€ν° λΈλμΉμλ§ μμΌλ―λ‘ λ¬Έμ λ₯Ό λ°λ‘μ‘μ μκ°μ΄ μμ΅λλ€.
νμ¬ μ΄κ²μ 릴리μ€λ λ²μ μ μν₯μ λ―ΈμΉμ§ μμΌλ©° λ§μ€ν° λΈλμΉμλ§ μμΌλ―λ‘ λ¬Έμ λ₯Ό λ°λ‘μ‘μ μκ°μ΄ μμ΅λλ€.
μ λ€λ¦°λ€. κ³νμ ꡬμνλ λμ λͺ κ°μ§ ν μ€νΈλ₯Ό ν΄λ³Όκ²
νμ¬ seccomp A2 μ²λ¦¬λ₯Ό νκ°νλ νλ‘κ·Έλ¨μ μμ±νμ΅λλ€. μ 체 νλ‘κ·Έλ¨μ λ€μμμ μ¬μ©ν μ μμ΅λλ€.
https://gist.github.com/drakenclimber/3c6b45ecd973ee495281ef225fa5e54a
κ°λ¨ν λ§ν΄μ, λ³΄λ€ νΌ κ·μΉμ "μ΅μ’ μμ±" "μ΅μ΄ μ²λ¦¬" μμλ‘ μμ±λ©λλ€.
>
κ·μΉμ΄ μ€λ¦μ°¨μμΌλ‘ μμ± λλ νν°μ κ²½μ°, μλ₯Ό λ€μ΄seccomp_rule_add(ctx, action1, syscall, 1, SCMP(SCMP_CMP_GT, 10)
seccomp_rule_add(ctx, action2, syscall, 1, SCMP(SCMP_CMP_GT, 20)
seccomp_rule_add(ctx, action3, syscall, 1, SCMP(SCMP_CMP_GT. 30)
if (A2 > 30)
do action3
if (A2 > 20)
do action2
if (A2 > 10)
do action1
>
κ·μΉμ΄ λ΄λ¦Όμ°¨μ μΌλ‘ μμ± λλ νν°μ κ²½μ°, μλ₯Ό λ€μ΄seccomp_rule_add(ctx, action3, syscall, 1, SCMP(SCMP_CMP_GT, 30)
seccomp_rule_add(ctx, action2, syscall, 1, SCMP(SCMP_CMP_GT, 20)
seccomp_rule_add(ctx, action1, syscall, 1, SCMP(SCMP_CMP_GT. 10)
if
λ¬Έμ μ°κ²°ν μ μμ΅λλ€.if (A2 > 10)
do action1
if (A2 > 20)
do action2
if (A2 > 30)
do action1
<
A2 μμ
μ΄ μλ νν°λ νμ¬ seccompμμ νμ©λμ§ μμ΅λλ€. <=
λ₯Ό μμ >
νν°μ λμΌνκ² λ§λλ λ°©λ²μ μμλΌ μ μμκΈ° λλ¬Έμ μ΄κ²μ μ΄μν΄ λ³΄μ
λλ€.tom<strong i="43">@OracleDesktop</strong> $ ./a2test 3
Failed to add rule
action = 0x5000e op = 0x3 datum = 18000 rc = -17
Mode 3 (LE descending) test failed. rc = -17
tom<strong i="46">@OracleDesktop</strong> $ ./a2test 4
Failed to add rule
action = 0x50006 op = 0x3 datum = 250 rc = -17
Mode 4 (LE ascending) test failed. rc = -17
src/db.c
μ κΉμμ΄ λ¬»ν μλ else if
λ
Όλ¦¬κ° <
μ€λ₯λ₯Ό μΌμΌν€λ κ² κ°μ΅λλ€. μ: . λ³κ²½/κ³ μΉ κ°μΉκ° μλμ§ νμ€νμ§ μμ΅λλ€.
νμ¬ λμμ μΊ‘μ²ν μ μλλ‘ μ΄ μ½λ μ€ μΌλΆλ₯Ό μλνλ ν μ€νΈλ‘ λ³ννλ €κ³ ν©λλ€.
μ°μ¬μ§ λλ‘ μ¬κΈ° μ μμ§λ μ§λμ£Όμ μΆκ°ν μλν ν μ€νΈμ μ€ν¨νμ΅λλ€. νκ³ λ€μ΄ κ·Έ μ΄μ λ₯Ό μμλ΄λλ‘ λ Έλ ₯νκ² μ΅λλ€.
batch name: 43-sim-a2_order
test mode: c
test type: bpf-sim
Test 43-sim-a2_order%%001-00001 result: SUCCESS
Test 43-sim-a2_order%%002-00001 result: SUCCESS
Test 43-sim-a2_order%%003-00001 result: SUCCESS
Test 43-sim-a2_order%%004-00001 result: SUCCESS
Test 43-sim-a2_order%%005-00001 result: SUCCESS
Test 43-sim-a2_order%%006-00001 result: SUCCESS
Test 43-sim-a2_order%%007-00001 result: SUCCESS
Test 43-sim-a2_order%%008-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%009-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%010-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%011-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%012-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%013-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%014-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%015-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%016-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%017-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%018-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%019-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%020-00001 result: FAILURE bpf_sim resulted in ERRNO(5)
λ΄ λμ - μμ μ μλͺ» μ μ©νμ΅λλ€. ν μ€νΈκ° ν΅κ³Όνκ³ μμ΅λλ€. ν΄ :)
νμ! :)
λλ κ·Έκ²μ λν΄ ν μ€νΈλ₯Ό μ€ν νλ€κ³ μκ° νμ§λ§ κ·Έ λΉμμλ λ§μ κ²μ κ°μ§κ³ λκ³ μμκΈ° λλ¬Έμ λ΄κ° μλͺ» κΈ°μ΅νκ³ μλ€κ³ μκ°νμ΅λλ€. κ³μ λ΄μ£Όμ μ κ°μ¬ν©λλ€. μ λ μ¬μ ν SELinuxμ κ°μ¬λ‘ μΈν΄ μ½κ° νΌλμ€λ½μ΅λλ€. κ·Έλ¬λ 컀λμ΄ μ§κΈ -rc5μ μκΈ° λλ¬Έμ λ³ν© μ μ μ μ½λμ μ€λ¨μ λλ μ¦μ μ§μ λ κ²μΌλ‘ μμν©λλ€. μ°½λ¬Έ ...
κ±±μ λ§. κ·Έκ²μ νμ€ν λ λμ μ°μ μμμ λλ€.
λλ λ€μν λΉνμ€μ μΈ ν μ€νΈλ₯Ό ν΅ν΄ λΉμ μ μμ§λ₯Ό μ€ννμ΅λλ€. λλ κ·Έκ²μ κΉ¨λ¨λ¦¬μ§ λͺ»νμ§λ§ μ§κΈκΉμ§ _db_tree_prune()μ μΌλΆλ§ μ°μ΅νκ³ μμ΅λλ€. λ³κ²½ μ¬νμ΄ λ νΈμν΄μ§κΈ° μμνμ§λ§ μ‘°κΈ λ μκ°μ λ€μ΄κ³ μΆμ΅λλ€.
_db_tree_prune() μ½λλ₯Ό μ°λ¬λ³΄κ³ κΉ¨λ¨λ¦΄ μ μμμ΅λλ€. Test 08-sim-subtree_checksλ prune() λ΄μμ λλΆλΆμ μ½λ κ²½λ‘λ₯Ό ν μ€νΈνλ λ° μ λ§ μ’μ΅λλ€.
λλ λΉμ μ μμ μμ λμ¨ λ³νκ° μ’λ€κ³ μκ°ν©λλ€.
ν 리νμ€νΈ #115λ₯Ό μ μΆνμ΅λλ€. λ‘€ μ€λΉκ° λ κ² κ°μμ
μ΄μ ν΄κ²°ν΄μΌ νλ―λ‘ μ’ λ£ν©λλ€(μμ κΈ°λ‘ μ°Έμ‘°).