第14åã SystemTap ãã¹ã¹ã¡ã
Tweet
ä»åã¯ãã«ã¼ãã«ã«é¢ãããã©ãã«è§£æã§å¤§æ´»èºãã SystemTap ã«ã¤ãã¦ã§ããSystemTap ã®ä½¿ç¨ã容èªã§ãããã©ãããåé¡äºè±¡ã®åå ã究æã§ãããã©ããã«ç´çµããããªãåãæã¨è¨ãããããã«éè¦ãªãã¼ã«ã§ããå°å ¥æé ã¨ä½¿ãæ¹ã«ã¤ãã¦ã¯ Red Hat 社ã®ã¦ã§ããµã¤ãã«ããè¨äºï¼ https://access.redhat.com/ja/node/882873 ï¼ãåç §ãã¦ããã ãã¨ãã¦ãããã§ã¯å®éã®èª¿æ»ã§ä½¿ç¨ã§ãããµã³ãã«ãç´¹ä»ãããã¨æãã¾ãã
ãµã³ãã«1ï¼åèµ·åè¦æ±ãã«ã¼ãã«ãããã¯ã«ç½®ãæããã
æ£å¸¸ãªã·ã£ãããã¦ã³ã·ã¼ã±ã³ã¹ãä¼´ããã«ã·ã¹ãã ãçªç¶åèµ·åããã¨ããã®ã¯ãã·ãªã¢ã«ã³ã³ã½ã¼ã«ã netconsole ã使ã£ã¦ã«ã¼ãã«ã¡ãã»ã¼ã¸ã®æç¡ã確èªãããã¨ãããããã§ããªããã·ã¹ãã 管çè ã«ã¨ã£ã¦æ©ã¾ãããã©ãã«ã§ããããããSystemTap ã容èªã§ããå ´åã«ã¯ãäºæãã¬åèµ·åè¦æ±ãã«ã¼ãã«ãããã¯ã«ç½®ãæãã¦ãã¾ããã¨ã§ kdump ãåå¾ãã誰ãåèµ·åè¦æ±ãçºè¡ãã¦ããã®ãããªãåèµ·åè¦æ±ãçºè¡ããã«è³ã£ãã®ãã調æ»ãããã¨ãã§ããããã«ãªãã¾ããï¼ãã ããstonithãããªãã«ãã©ã¼ã«ããªã©ç½®ãæãã§ããªãåèµ·åè¦æ±ãããã¾ãï¼
---------- reboot2panic.stpããããã ---------- function call_panic() %{ panic("Calling panic() due to machine restart\n"); %} probe kernel.function("machine_emergency_restart") { call_panic(); } probe kernel.function("machine_restart") { call_panic(); } ---------- reboot2panic.stpãããã¾ã§ ----------
---------- ã³ãã³ãã©ã¤ã³ããããã ---------- # stap -p4 -g -m stap_reboot2panic reboot2panic.stp # staprun stap_reboot2panic.ko & ---------- ã³ãã³ãã©ã¤ã³ãããã¾ã§ ----------
æ£å¸¸ãªã·ã£ãããã¦ã³ã·ã¼ã±ã³ã¹ãä¼´ã£ã¦åèµ·åããå ´åã«ã¯ã«ã¼ãã«ãããã¯ã«ç½®ãæããããªãã®ã§ãã·ã£ãããã¦ã³ã·ã¼ã±ã³ã¹ã«æãå ããã« staprun ã³ãã³ããèªåçã«çµäºããããã«ãï¼ staprun ã³ãã³ãã® -L ãªãã·ã§ã³ã stap ã³ãã³ãã® -Fãªãã·ã§ã³ã§ã¯ãªãï¼ã·ã§ã«ã® & æå®ãç¨ãã¦ããã¯ã°ã©ã¦ã³ãã§éå§ããããã«ãã¦ãã¾ãããã®ãããã·ã£ãããã¦ã³ã·ã¼ã±ã³ã¹ä»¥å¤ããå±ããã·ã°ãã«ã«ããstaprun ã³ãã³ããçµäºãã¦ãã¾ãå¯è½æ§ããããã¨ã«çæãã以å¤ã«ãç¹å¥ãªå¯¾å¦ã¯ä¸è¦ã§ãã
ãµã³ãã«2ï¼ãã¡ã¤ã«ã®ãªã¼ãã³è¦æ±ã¨ããã°ã©ã ã®å®è¡è¦æ±ã追跡ããã
ãç·æ¥ã³ã©ã ï¼ bash èå¼±æ§ï¼ CVE-2014-6271 ï¼ã®å½±é¿ç¯å²ã®èª¿æ»æ¹æ³ã«ã¤ãã¦ãã®ã調æ»æ¹æ³2ï¼ System Call Auditing ã¨ç¬èªã«ã¼ãã«ã¢ã¸ã¥ã¼ã«ãä½µç¨ãã調æ»ãã§ã¯ãååç´¹ä»ãã TaskTracker ãç¨ãã¦ã System Call Auditing ãã°ã®ä¸ã«ããã»ã¹ã®å®è¡å±¥æ´ãè¨é²ããããã«ãã¦ãã¾ãããããã¦ãã調æ»æ¹æ³4ï¼ SystemTap ã§ä½æããã«ã¼ãã«ã¢ã¸ã¥ã¼ã«ãç¨ãã調æ»ãã§ã¯ãSystemTap ãç¨ãã¦ãããã°ã©ã ã®å®è¡è¦æ±ã®ã¿ãããã»ã¹ã®å®è¡å±¥æ´ã¨ä¸ç·ã«è¨é²ãã¦ãã¾ãããä»åã¯ãããã°ã©ã ã®å®è¡è¦æ±ã«å ãã¦ãã¡ã¤ã«ã®ãªã¼ãã³è¦æ±ãè¨é²ãã¦ã¿ããã¨æãã¾ãã
---------- trace_open_exec.stpããããã ---------- global task_domain[32768]; global history_domain; global history_execve; global history_read; global history_write; probe begin { printf("Probe start!\n"); } function get_current:long() { return task_current() & %{ ULONG_MAX %}; } function is_success:long(ret:long) { return ret <= -4096="" ||="" ret="">= 0; } function make_domain:string() { task = get_current(); if (task_domain[task] == "") task_domain[task] = sprintf("%s(%d)", execname(), pid()); if (history_domain[task_domain[task]] == "") history_domain[task_domain[task]] = task_domain[task]; return history_domain[task_domain[task]]; } probe kernel.function("copy_process").return { if (is_success($return)) task_domain[$return] = make_domain(); } probe kernel.function("do_execve") { make_domain(); } probe kernel.function("do_execve").return { if (is_success($return)) { task = get_current(); domain = task_domain[task]; if (domain != "") { filename = kernel_string($filename); printf("[%s] execve %s by %s\n", ctime(gettimeofday_s()), filename, domain); name = " " . filename . "\n"; if (isinstr(history_execve[domain], name) == 0) history_execve[domain] .= name; task_domain[task] .= " " . filename; history_domain[task_domain[task]] = task_domain[task]; } } } probe kernel.function("do_sys_open").return { if (is_success($return)) { domain = make_domain(); filename = user_string($filename); if (($flags & 3) != 3) printf("[%s] %s %s by %s\n", ctime(gettimeofday_s()), ($flags & 3) == 0 ? "read" : (($flags & 3) == 1 ? "write" : "read/write"), filename, domain); name = " " . filename . "\n"; if (($flags & 3) == 0 || ($flags & 3) == 2) if (isinstr(history_read[domain], name) == 0) history_read[domain] .= name; if (($flags & 3) == 1 || ($flags & 3) == 2) if (isinstr(history_write[domain], name) == 0) history_write[domain] .= name; } } probe kernel.function("free_task") { delete task_domain[$tsk]; } probe end { printf("Probe end!\n"); foreach(i in history_domain) { domain = history_domain[i]; printf("domain: %s\n", domain); if (history_execve[domain] != "") printf("execve:\n%s", history_execve[domain]); if (history_read[domain] != "") printf("read:\n%s", history_read[domain]); if (history_write[domain] != "") printf("write:\n%s", history_write[domain]); printf("\n"); } delete history_domain; delete history_read; delete history_write; delete history_execve; } ---------- trace_open_exec.stpãããã¾ã§ ---------- =>
---------- ã³ãã³ãã©ã¤ã³ããããã ---------- # stap -p4 -g -DMAXSTRINGLEN=4096 -m stap_trace_open_exec trace_open_exec.stp # staprun stap_trace_open_exec.ko ---------- ã³ãã³ãã©ã¤ã³ãããã¾ã§ ----------
staprun ãéå§ããã¨ããªã¢ã«ã¿ã¤ã ã«ãã¡ã¤ã«ã®ãªã¼ãã³ã¨ããã°ã©ã ã®å®è¡è¦æ±ã表示ããã¦ããã¾ããããã¦ã Ctrl-C ã«ããä¸æããã¨ãããã¾ã§ã«èç©ãããçµæããããã»ã¹ã®å®è¡å±¥æ´åä½ã§åºåãããããã«ãªã£ã¦ãã¾ãã
ãã®ãµã³ãã«ã¯ç°¡åã«ä½¿ãã¾ãããç¸å¯¾ãã¹åãªã©ããã®ã¾ã¾è¨é²ããã¦ãã¾ããããè¦ä»¶ãæºãããªãå¯è½æ§ãããã¾ãã絶対ãã¹åã使ã£ã¦æ£ç¢ºã«è¨é²ãããå ´åã«ã¯ã調æ»æ¹æ³3ï¼ç¬èªã«ã¼ãã«ã¢ã¸ã¥ã¼ã« AKARI ãç¨ãã調æ»ãããæ¤è¨ãã ããã
ï¼åç°å²å¤«ï¼
ã³ã¼ãã¼ãã¬ã¼ã¯ããµãã¼ãã«ãããç°å¢åé¡ã
ä¸å ·åã®èª¿æ»ãåå 解æãè¡ãéã«ãããããµãã¼ãã»ã³ã¿ã¼ã®ä¸ã§åç¾ã§ãããã©ããã¯ãåé¡è§£æ±ºã®æå¦ãå·¦å³ããéè¦ãªéµã¨ãªãã¾ããä¾é ¼å ã§çºçããäºè±¡ããµãã¼ãã»ã³ã¿ã¼ã®ä¸ã§åç¾ãããã¨ãã§ããã°ãæåã確èªãã¤ã¤ãã½ã¼ã¹ã³ã¼ãã解æãã¦èª¿ã¹ããã¨ãã§ãã¾ãï¼å¯¾è±¡ããªã¼ãã³ã½ã¼ã¹ã§ããã°ï¼ã解決ã«åãããã¹ãã¼ããæã«ãããããªãã®ã§ãã
ä¸æ¹ãåç¾ãã§ããªãå ´åã¯ããµãã¼ãã»ã³ã¿ã¼ã®ä¸ã§ã¯ããåé¡ã®æå¨ã確èªã§ãã¦ããªããç¶æ ã§ããåå¨ãã¦ããªãåé¡ã解ããã¨ã¯èª°ã«ãã§ãã¾ããããããµãã¼ãã»ã³ã¿ã¼ã§ã¯ãªãã¨ããã®åé¡ãåç¾ãããã¨åªåãããã¨ã«ãªãã¾ããå®éã®åãåããã§ã¯ãæ®å¿µãªãããã¡ãã®ã»ããå§åçã«å¤ããªã£ã¦ãã¾ãã
ã§ã¯ãã©ããã¦ä¾é ¼å ã§çºçããåé¡ãããµãã¼ãã»ã³ã¿ã¼ã®ä¸ã§åç¾ããªããã¨ãèµ·ããã®ã§ããããï¼ããã«ã¤ãã¦å ·ä½ä¾ï¼ããããå®ä¾ãããã¾ãï¼ãè¦ãã¨ç´å¾ããã ããã¨æãã¾ãã
- ãã¼ã¿ã®å 容ã«ä¾åãã¦èµ·ããåé¡
- è¨å®ãã¡ã¤ã«ãã¢ããªã±ã¼ã·ã§ã³ã®èµ·åãªãã·ã§ã³ã«ããçããåé¡
- 使ç¨ãã¦ããããã«ã¦ã§ã¢ã«ããçããåé¡
- 使ç¨ãã¦ããã½ããã¦ã§ã¢ã®ç¹å®ãã¼ã¸ã§ã³ã®ä¸å ·åã«ããçããåé¡
- ãæéãã«é¢ããè¦å ã«ããçããåé¡
- 使ç¨ãã¦ãããã¼ãã¦ã§ã¢ã«ããçããåé¡
- ã·ã¹ãã ã®è² è·ç¶æ ã«ããçããåé¡
- ã¯ã©ã¤ã¢ã³ãã®æ¥ç¶æ°ã«ããçããåé¡
- ãã£ã¹ã¯æ§æã«ããçããåé¡
ã¤ã¾ããä¾é ¼å ã§çºçããåé¡ããµãã¼ãã»ã³ã¿ã¼ã§åç¾ããªãçç±ã¯ãåæ¹ã®ãç°å¢ã®å·®ç°ãã«ããããã§ããããããããããããã¨ã«ä¾é ¼å ã®ç°å¢ã¯å¤ãã®å ´åãåä¸ã§ã¯ããã¾ãããéçºç°å¢ã試é¨ç°å¢ãæ¤è¨¼ç°å¢ã移è¡ç°å¢ãæ¬çªç°å¢ï¼åç¨ç°å¢ï¼ãªã©è¤æ°ã®ç°å¢ãåå¨ããã®ãæ®éã§ãã
ååããããéã«æèãã¦æ¬²ããã®ã¯ãããµãã¼ãã»ã³ã¿ã¼ã®æè¡è ã¯ãæãã¦ããããªãã¨ä¾é ¼å ã®ç°å¢ã確èªãããããªããã¨ãããã¨ã§ããä»®ã«ä½¿ç¨ãã¦ããããã«ã¦ã§ã¢ãåç¨è£½åã«èµ·å ããä¸å ·åã®å ´åããããã使ç¨ãã¦ãããã¨ãæãã¦ããããªããã°ããµãã¼ãã»ã³ã¿ã¼ã®ä¸ã§ã©ãã»ã©èª¿æ»ãã¦ãçãã¯è¦ã¤ããã¾ãããç°å¢ãæ£ç¢ºã«èª¬æãããã¨ã®éè¦æ§ãåèªèãã¦ããã ãããã¨æãã¾ãã
ï¼åç°å£æ ï¼
Tweet