动态链接(相对于静态链接)

2020-06-27 01:59:57

调查结果:绝对不是ex.c#include<;stdio.h>;#include<;stdlib.h>;#include<;time.h>;#include<;unistd.h>;int main(int argc,char*argv[]){struct timespec ts;lock_gettime(lock_monotonic,&;ts);fprintf(stdout,&34;%)。if(argc==1){char*args[]={";";,";,null};execvp(argv[0],args);}否则{fprintf(stdout,";\n";);}返回0;}。

test.sh我的结果$musl-GCC-o ex ex.c$./test.sh|awk';BEGIN{SUM=0}{SUM+=$2-$1}END{PRINT SUM/NR}';137263$MUSL-GCC-STATIC-O EX EX.c$./test.sh|AWK';BEGIN{SUM=0}{SUM+=$2-$1}END{PRINT SUM/NR}';64048。

研究结果:不是真的平均,动态链接的可执行文件只使用其依赖项中提供的符号的4.6%。一个好的链接器可以删除不使用的符号。nsyms.go程序包mainimport(";bufio";";fmt";";os";os/exec";";path/filepath";;string";)func main(){ldd:=exec.Command(";ldd";,os.Args[1])rc,err:=ldd.StdoutProtocol()if err!=nil{Panic(Err)}ldd.Start()var libpath[]string scan:=bufio.NewScanner(Rc)for scan.Scan(){line:=scan.Text()[1:]/*\t*/sp:=string.Split(line,";";)var lib string。){lib=sp[2]}Else{lib=sp[0]}if!filepath.IsAbs(Lib){lib=";/usr/lib/";+lib}libpath=append(libpath,lib)}ldd.Wait()rc.Close()syms:=make(map[string]interface{})for_,path:=range libpath{objdump:=exec.Command(&。,path)rc,err:=objdump.StdoutTube()if err!=nil{Panic(Err)}objdump.Start()scan:=bufio.NewScanner(RC)for i:=0;scan.Scan();i++{if i<;4{Continue}line:=scan.Text()sp:=string s.Split(line,";";)if len(Sp)<。5{Continue}sym:=sp[len(Sp)-1]syms[sym]=nil}objdump p.Wait()rc.Close()}objdump:=exec.Command(";objdump";,";-R";,os.Args[1])rc,err=objdump.StdoutTube()if err!=nil{Panic(Err)}objdump.Start()Used:=make(map[string]interface{})scan=bufio.NewScanner(Rc)for i:=0;scan.Scan();i++{if i<;5{Continue}sp:=string。Split(scan.Text(),";";)if len(Sp)<;3{Continue}sym:=sp[len(Sp)-1]Used[sym]=nil}objdump.Wait()rc.Close()if len(Syms)!=0&;&;len(已用)!=0&;&;len(已用=len(系统){fmt.Printf(";%50s\t%d\t%d\t%f\n";,os.args[1],len(Syms),len(已用),float64(len(已用))/float64(len(Syms))}}。

用法$find/usr/bin-type f-Executable-print|xargs-n1./nsyms>;Results.txt$awk';{n+=$4}end{print n/NR}';<;Results.txt。

我的结果是,静态链接的库中的安全漏洞是否会导致较大或无法管理的更新?

调查结果:实际上并不包括libc,在2019年影响我系统上100多个二进制文件的库中,只有dbus、GNUTLS、开罗、libssh2和curl具有严重或严重漏洞。265个二进制受到其余的影响。2019年,升级我系统上所有受CVE影响的二进制文件的总下载成本为3.8 GiB。如果去掉glibc,这将减少到1.0 GiB。对于给定的静态链接二进制文件,是否会在上次构建日期之后引入这些漏洞也是未知的;如果是这样,则该二进制文件将不需要更新。许多漏洞也被限制在特定的代码路径或用例中,没有在依赖项中调用该代码路径的二进制文件不会受到影响。在漏洞之后确定此信息的过程可以自动进行。对于mbox.item()中的m,Arch-security提取tcves.py import email.utilsimport mailboximport reimport shleximport timepacman_re=re.build(r';pacman-syu.*';)everity_re=re.build(r';严重性:(.*)';)mbox=mailbox.mbox(";arch-security.mbox";):m=m[。]对于m.walk()中的部分:if part.is_multipart():如果content_type==';文本/纯文本';则继续content_type=part.get_content_type()[charset]=part.get_charsets(";utf-8";)。用法:body=part.get_payload(decode=True).decode(Charset)Break pkgs=pacman_re.findall(Body)Severity=Severity_re.findall(Body)Date=email.utils.parsedate(Date)if len(Pkgs)==0或Date=None:Continue if Date[0]<;=2018或Date[0]>;2019参数:Continue Severity=Severity[0]args=shlex.plit(。

$python3 Extractcves.py|grep Critical>;cves.txt$xargs Pacman-ql<;cves.txt|grep\\.so|awk';{print$1}';|ort-u>;affected.txt#手动删除Firefox、Thunderbird等软件包;写入剩余部分。txt$xargs Pacman-ql<;剩余部分。ldd.txt$./scope e.sh<;libs.txt