阅读:2753回复:0
安全漏洞本质扯谈之决战汇编代码
◆0 前言
当前比较流行也比较有效率的挖掘的漏洞的方法是Fuzzing,当然这也需要花点时间去写Fuzzing程序。然而不是每个东西都有必要去写Fuzzing程序,也不是每个东西都可以去Fuzzing的,所以也还是要继续修炼我们的二进制安全流派内功—“肉眼挖洞神功”。 安全漏洞在源代码层面和汇编代码层面会有不同的表现,想要进阶升级的话,必须清晰的了解每种安全漏洞类型在源代码层面和汇编代码层面都是张什么样的。有些安全漏洞在源代码层面容易发现它,有些安全漏洞则在汇编代码层面比较容易发现它。不管是源代码层面还是汇编代码层面,普通人看代码的时候即使看到有安全漏洞的那些代码的时候,往往是“只见代码,不见漏洞”。修炼“肉眼挖洞神功”的目标是看到那些疑似有问题的代码时候能够警觉,能够识别,并快速判定是否可形成安全漏洞。 早些时候给我们翰海源的小伙伴们讲过《深入安全漏洞-Root Cause of Vulnerabilities》和《决战汇编代码》,希望小伙伴们能够掌握安全漏洞的本质原因以及练就“肉眼挖洞神功”。今天把里面的部分例子跟大伙一起分享下。 ◆1 源代码层面 1. Link Attack *unix 下的 link attack,有意识到吗? #!cif(access("file",W_OK)!=0){ exit(1);}fd = open("file",O_WRONLY);write(fd,buffer,sizeof(buffer));2. Integer Overflow Example in OpenSSH 3.1 发生在真实的 openssh 3.1 ,有漏洞吗? #!cu_int nresp;...nresp = packet_get_int();if(nresp){ response = xmalloc(nresp * sizeof(char*)); for(i=0; i 1024){ error("illegal input, not enough room in buffern"); return 1; } if(read(sockfd, buffer, length) < 0){ error("read: %m"); return 1; } return 0;}4. Truncation Vulnerability Example in NFS 整形截断问题? #!cvoid assume_privs(unsigned short uid) { seteuid(uid); setuid(uid);}int become_user(int uid){ if (uid == 0) die("root isnt allowed"); assume_privs(uid);}5. 苹果SSL/TLS 重大安全漏洞的细节 (CVE-2014-1266)多个goto fail造成重大安全隐患。 #!cstatic OSStatusSSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams, uint8_t *signature, UInt16 signatureLen){ ... if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; peerPubKey, dataToSign, /* plaintext */ dataToSignLen, /* plaintext length */ signature, signatureLen); ...fail: SSLFreeBuffer(&signedHashes); SSLFreeBuffer(&hashCtx); return err;}6. MS-RPC DCOM Buffer Overflow (冲击波) 冲击波蠕虫只因为一个缓冲区溢出。 #!cHRESULT GetMachineName (WCHAR * pwszPath) { The WCHAR wszMachineName [N + 1]); ... LPWSTR pwszServerName = wszMachineName; while (* pwszPath! = L '') * PwszServerName + + = * pwszPath + +; ... }7. 有漏洞吗? #!cunsigned short read_length(int sockfd){ unsigned short len; if(full_read(sockfd, (void *)&len, 2) != 2) die("could not read length!n"); return ntohs(len);}int read_packet(int sockfd){ struct header hdr; short length; char *buffer; length = read_length(sockfd); if(length > 1024){ error("read_packet: length too large: %dn", length); return 1; } buffer = (char *)malloc(length+1); if((n = read(sockfd, buffer, length) < 0){ error("read: %m"); free(buffer); return 1; } buffer[n] = ''; return 0;}8. 有漏洞吗? 提示: 5rOo5oSPc216ZW9m #!cchar *read_username(int sockfd){ char *buffer, *style, userstring[1024]; int i; buffer = (char *)malloc(1024); if(!buffer){ error("buffer allocation failed: %m"); return NULL; } if(read(sockfd, userstring, sizeof(userstring)-1) |
|