source code analysis for security through llvm
play

Source Code Analysis for Security through LLVM Lu Zhao HP Fortify - PowerPoint PPT Presentation

Source Code Analysis for Security through LLVM Lu Zhao HP Fortify lu.zhao@hp.com Static Code Analyzer for Security Static Code Analyzer for Security (HP Fortify SCA) C/C++ Java Vulnerabilities LLVM Language independent Services C/C++ Swift


  1. Source Code Analysis for Security through LLVM Lu Zhao HP Fortify lu.zhao@hp.com

  2. Static Code Analyzer for Security

  3. Static Code Analyzer for Security (HP Fortify SCA) C/C++ Java Vulnerabilities

  4. LLVM Language ‐ independent Services C/C++ Swift Objective ‐ C 22nd

  5. Bitcode for Source Analysis? C/C++ Swift Objective ‐ C Vulns 22nd

  6. Bitcode for Source Analysis? C/C++ Swift Objective ‐ C Vulns 22nd

  7. HP Fortify SCA for Objective ‐ C C/C++ clang -g Swift Objective ‐ C Vulns clang -gsrc 22nd

  8. Bitcode with Enhanced Source Info C/C++ clang -g Swift Objective ‐ C Vulns clang -gsrc swift -gsrc frontend -gsrc

  9. Bitcode with Enhanced Source Info C/C++ clang -g Swift Objective ‐ C Vulns clang -gsrc cross ‐ language swift -gsrc analysis frontend -gsrc

  10. Why we cannot do this today? C/C++ clang -g Swift Objective ‐ C Vulns

  11. Objective ‐ C Static Taint Analyzer @implementation HtmlViewController - (void)viewDidLoad { if (_content) { … } else { // Display the "About iGoat" splash screen as a default. … NSString *fileContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; [self.webView loadHTMLString:[NSString stringWithFormat:fileContents, version] baseURL:baseURL]; } } … @end 15

  12. Objective ‐ C Static Taint Analyzer @implementation HtmlViewController - (void)viewDidLoad { if (_content) { … } else { // Display the "About iGoat" splash screen as a default. … taint source by API doc NSString *fileContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; [self.webView loadHTMLString:[NSString stringWithFormat:fileContents, version] baseURL:baseURL]; } } … @end 16

  13. Objective ‐ C Static Taint Analyzer @implementation HtmlViewController - (void)viewDidLoad { if (_content) { … } else { // Display the "About iGoat" splash screen as a default. … NSString *fileContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; [self.webView loadHTMLString:[NSString stringWithFormat:fileContents, version] baseURL:baseURL]; } } taint sink by API doc … @end 17

  14. Objective ‐ C Static Taint Analyzer @implementation HtmlViewController - (void)viewDidLoad { if (_content) { … } else { // Display the "About iGoat" splash screen as a default. … taint source NSString *fileContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; [self.webView loadHTMLString:[NSString stringWithFormat:fileContents, version] baseURL:baseURL]; } taint sink } … @end 18

  15. Objective ‐ C Static Taint Analyzer • Our taint source or taint sink is written in a declarative fashion, which is matched by the analyzer against its method signature. NodeType: TaintSource ClassName: NSArray | NSString | NSData | NSConstantString MethodSig: arrayWithContentsOfFile: | (string|init)WithContentsOfFile:(usedE|e)ncoding:err or: |initWithContentsOfFile: | (data|init)WithContentsOfFile:(options:error:)? Output: return TaintFlags: FILE_SYSTEM,XSS 19

  16. A Source ‐ friendly IR • A method signature public class NSString extends NSObject { public virtual NSString* initWithContentsOfFile$encoding$error$( NSString* this, …); } 20

  17. From Bitcode to Source int convert(unsigned u) { return 0; } define i32 @convert(i32 %u) #0 { entry: ret i32 0 } !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"convert", metadata !"convert“,...} ; [ DW_TAG_subprogram ] [line 25] [def] [convert] 21

  18. From Bitcode to Source NamedMDNode *M_Nodes = M->getNamedMetadata("llvm.dbg.cu"); DIArray SPs = CU.getSubprograms(); for (unsigned i2 = 1, e2 = SPs.getNumElements(); i2 != e2; ++i2) { DISubprogram DISP(SPs.getElement(i2)); DICompositeType DIC( DISP .getType()); DIArray Tys = DIC.getTypeArray(); // Tys[0] return type // others are parameter types 22 }

  19. No Metadata for Declarations extern int convert(unsigned u); declare i32 @convert(i32 %u) #2; No metadata describing @convert . 23

  20. No Metadata for Declarations extern int convert(unsigned u); declare i32 @convert(i32 %u) #2; Metadata emission is a subprocess during code emission. No code generation, no metadata. 24

  21. Generate Bitcode with Rich Source Info • Decouple metadata emission and code generation. • Control rich metadata emission by using ‐ gsrc $ clang –gsrc –O0 –c –emit-llvm –S HtmlViewController.m 25

  22. Bitcode with Rich Source Info declare extern_weak i8* @"-[NSString initWithContentsOfFile:encoding:error:]" (%1*, i8*, %1*, i64, %3**) !1538 = metadata !{i32 786478, metadata !4, metadata !302, metadata !"-[NSString initWithContentsOfFile:encoding:error:]" ,...} ; [ DW_TAG_subprogram ]... 26

  23. Bitcode with Rich Source Info Type signature: (NSString*, objc_selector*, NSString*, NSStringEncoding, NSError**) -> NSString* typedef: NSStringEncoding, NSUInteger, long unsigned int 27

  24. A Source ‐ friendly IR • NST public class NSString extends NSObject { public virtual NSString* initWithContentsOfFile$encoding$error$( NSString* this, …); } 28

  25. Bitcode with Enhanced Source Info C/C++ clang Swift Objective ‐ C clang -gsrc taint analysis Vulns

  26. Small Modification Big Opportunity • Entire patch to Clang/LLVM has 543 lines for 3.3 (git diff) • Upgrading to 3.5 30

  27. Small Modification Big Opportunity • All frontends should implement this feature clang -gsrc C/C++ swift -gsrc frontend -gsrc Swift Objective ‐ C taint analysis Vulns 31

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend