Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code...

38
Thema Securing Applications with Code Review Dr. Bruce Sams [email protected]

Transcript of Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code...

Page 1: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Thema

Securing Applicationswith Code Review

Dr. Bruce Sams

[email protected]

Thema

Securing Applicationswith Code Review

Dr. Bruce Sams

[email protected]

Page 2: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Explain what techniques are used in acode review

Show what kind of problems a reviewcan and cannot identify

Discuss the practical limits of codereview

Discuss when a review should beperformed and by whom

AgendaAgenda

Explain what techniques are used in acode review

Show what kind of problems a reviewcan and cannot identify

Discuss the practical limits of codereview

Discuss when a review should beperformed and by whom

Page 3: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

About

OPTIMAbitGmbH

Focus Customers Credo

IT Security forapplications

andinfrastrucutres

Companiesover ca. 500Employees

Independentconsulting of thehighest quality

Page 4: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Where do vulnerabilities come from?Where do vulnerabilities come from?Ca. ¾ of all vulnerabilities arise in applications

Cryptography0%

Network Stack1%

Other2% Comm. Protocol

2%Hardware

3%

%Hardware

3%

Operating System15%

Application(Server)

36%

Application(Client)

40%

Page 5: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Vulnerabilities (overview)Vulnerabilities (overview)Vulnerabilities exists at all levels

Brow

ser

Net

wor

kFi

rew

all Application Server

WebApplication

LDAP

DatabaseW

ebAp

pFi

rew

all

Local data storage

Client Spoofing

JavaScript

Phishing

HTTP/HTTPS „hole“

Insecure zoning

Insecure validation

Insecure sessions

Insecure configuration

Insecure error handling

Insecure persistence

LDAP Injection

SQL Injection

XPATH Injection

Brow

ser

Net

wor

kFi

rew

all

Operating SystemDatabase

Web

App

Fire

wal

l

Page 6: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

The number and aggressiveness ofattacks is constantly increasing

The attackers are professionals: thecybermafia or governments.

Web applications are preferred targetsbecause they often have so manyvulnerabilities.

Web Applications are in especially in DangerWeb Applications are in especially in DangerWeb applications are the preferred target for cybercriminals

30

40

50

60

70 The number and aggressiveness of

attacks is constantly increasing

The attackers are professionals: thecybermafia or governments.

Web applications are preferred targetsbecause they often have so manyvulnerabilities.

0

10

20

30

% Sites

Page 7: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Code Review and Code AnalysisCode Review and Code Analysis

SecureSoftwareLifecycle

CodeReview

• Perform on Code• Patterns• Stack variables• Data flow

StaticCodeReview

CodeAnalysis

• Perform on Code• Patterns• Stack variables• Data flow

• Perform on Binary• Run in Sandbox• Monitor I/O• Monitor variables

Dynamic

Page 8: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Problem Categories and StrategiesProblem Categories and StrategiesCategory Examples Difficulty Strategy

Conventions naming, formatting 1 Patterns

Structure cyclomatic complexity,affine/afferent binding,package dependencies, etc.

2 Patternscyclomatic complexity,affine/afferent binding,package dependencies, etc.

Implemen-tation

null pointer, endless loop,unreachable code, dangerousAPI calls

2 - 4 PatternsStack Analysis

Security Authorization, authorization,url encoding, injection,sessions, configuration, intra-procedural calls

4 – 5 PatternsStack AnalysisData FlowBusiness Logic

Page 9: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

SOME EXAMPLE CODE PROBLEMS

Page 10: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Some Simple ExamplesSome Simple Examples

Null Pointer Exception

String s = null;

if(s != null || s.length() > 0) //evaluate s.length()

if(s == null | s.equals("")) //evaluate s.equals()

Little Bug Patterns (lots of them)

int x = 1;

int y = x<<32; //bit shift more than 31 places

Null Pointer Exception

String s = null;

if(s != null || s.length() > 0) //evaluate s.length()

if(s == null | s.equals("")) //evaluate s.equals()

Little Bug Patterns (lots of them)

int x = 1;

int y = x<<32; //bit shift more than 31 places

Page 11: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Some Simple ExamplesSome Simple Examples

Bad/Incorrect Method Invocation

String s = "hello "; //extra white space

s.trim();

someMethod(s); //should use s = s.trim()

s = s.trim();

Bad/Incorrect Method Invocation

String s = "hello "; //extra white space

s.trim();

someMethod(s); //should use s = s.trim()

s = s.trim();

Page 12: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

False negative (FN): Non-detection of an existing problem

False positive (FP): Detection ofa „problem“ that is not really aproblem

True positive (TP): Detection of areal problem.

Flagged Non-Conformity (FNC):Indication that a problem mightexist at a given code location.

Most FNCs are the result ofturning on too many filters in atool (e.g. Implement Serializablein Java).

This can lead to thousands ofFNCs:

FNC/TP >= 1000 !

False Positive, False Negative, True Positive?False Positive, False Negative, True Positive?Many analysis tools report a large number of „false positives“

False negative (FN): Non-detection of an existing problem

False positive (FP): Detection ofa „problem“ that is not really aproblem

True positive (TP): Detection of areal problem.

Flagged Non-Conformity (FNC):Indication that a problem mightexist at a given code location.

Most FNCs are the result ofturning on too many filters in atool (e.g. Implement Serializablein Java).

This can lead to thousands ofFNCs:

FNC/TP >= 1000 !

Page 13: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

False Positive: Simple ExampleFalse Positive: Simple Exampleint getString(int i) {

String s = null;

switch (i) {

case 1:

s = "one";

break;

case 2:

s = "two";

break;

}

return s.length(); //NullPointerException?

}

int getString(int i) {

String s = null;

switch (i) {

case 1:

s = "one";

break;

case 2:

s = "two";

break;

}

return s.length(); //NullPointerException?

}

Page 14: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

False Negative: Pointer ComplexityFalse Negative: Pointer Complexity

String s1 = <TAINTED DATA>

StringBuffer b1 = new StringBuffer();

StringBuffer b2 = new StringBuffer();

//Do something here . . .

b1.append(s1);

String s2 = b2.toString();

Question: is s2 safe to use?

StringBuffer

StringBuffer

b1

b2

String s1 = <TAINTED DATA>

StringBuffer b1 = new StringBuffer();

StringBuffer b2 = new StringBuffer();

//Do something here . . .

b1.append(s1);

String s2 = b2.toString();

Question: is s2 safe to use?

StringBuffer

StringBuffer

StringBuffer

b1

b2

Page 15: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Tracing Tainted DataTracing Tainted DataAn application‘s call graph can be large

and difficult to model:

10 steps with 10 branches gives ~ 1010 nodes.

If each node requires 1KB memory to model,then a full model requires 1013 Bytes = 104 GBRAM.

Hard to solve the general problem completely.

Servlet.getParameter("name")

String.substring()

An application‘s call graph can be largeand difficult to model:

10 steps with 10 branches gives ~ 1010 nodes.

If each node requires 1KB memory to model,then a full model requires 1013 Bytes = 104 GBRAM.

Hard to solve the general problem completely.

Servlet.getParameter("name")

String.substring()

Page 16: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Source/Sink Example: SQL InjectionSource/Sink Example: SQL Injection

String s = request.getParameter("name");

Connection connection = …;String q = "'SELECT * FROM Users WHERE NAME ='" + s + "'";

connection.executeQuery(q);

Source = Manipulated Information in Request

name = xxx' OR 1 = 1;--

Sink = executeQuery

String s = request.getParameter("name");

Connection connection = …;String q = "'SELECT * FROM Users WHERE NAME ='" + s + "'";

connection.executeQuery(q);

Source = Manipulated Information in Request

name = xxx' OR 1 = 1;--

Sink = executeQuery

Page 17: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Cross-Site ScriptingCross-Site ScriptingThe HTML form...

<form action="/address">

Address, please: <input type="text" name="address">

</form>

The JSP code...Your address: <%= request.getParameter("address") %>

Secure using input validation or output encodingvalidateInput(request.getParameter(”address”));

response.write(URLEncoder.encode(XXX,String encoding));

The HTML form...<form action="/address">

Address, please: <input type="text" name="address">

</form>

The JSP code...Your address: <%= request.getParameter("address") %>

Secure using input validation or output encodingvalidateInput(request.getParameter(”address”));

response.write(URLEncoder.encode(XXX,String encoding));

Page 18: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Tracing Tainted InformationTracing Tainted Information

Servlet.getParameter("name")

Validator

String.substring()

Servlet.getParameter("name")

Statement.execute (…)

String.substring()

Page 19: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Further Issues and ComplicationsFurther Issues and Complications

Maps and containers are generally difficult to handle.

String name = <TAINTED DATA>

map.put("USER", name);

map.put("USER", someOtherString);

map.get("USER"); // tainted?

Pointer uncertainties add to the reflection problem (e.g., suppose adynamic className as in previous example comes from a Map)

Maps and containers are generally difficult to handle.

String name = <TAINTED DATA>

map.put("USER", name);

map.put("USER", someOtherString);

map.get("USER"); // tainted?

Pointer uncertainties add to the reflection problem (e.g., suppose adynamic className as in previous example comes from a Map)

Page 20: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Dynamic Class LoadingDynamic Class Loading

Dynamic class loading and reflection complicates knowing which classeswill be instantiated at runtime.

String myClass = <TAINTED DATA>

Class class = Class.forName(myClass);

Object o = class.newInstance();

Pointer uncertainties add to the reflection problem (e.g., suppose theclassName String comes from a Map)

Dynamic class loading and reflection complicates knowing which classeswill be instantiated at runtime.

String myClass = <TAINTED DATA>

Class class = Class.forName(myClass);

Object o = class.newInstance();

Pointer uncertainties add to the reflection problem (e.g., suppose theclassName String comes from a Map)

Page 21: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

String userType = <TAINTED DATA>

if (userType.equals("NormalUser")){

setUserPermisions("Normal_Permissions");

} else { //user must be admin

setUserPermissions("Admin_Permissions");

}

How can a tool understand the business logic?

How can a tool interpret the Permission Strings?

False Negative: Authentication LogicFalse Negative: Authentication Logic

String userType = <TAINTED DATA>

if (userType.equals("NormalUser")){

setUserPermisions("Normal_Permissions");

} else { //user must be admin

setUserPermissions("Admin_Permissions");

}

How can a tool understand the business logic?

How can a tool interpret the Permission Strings?

Page 22: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

if (Date == Easter) {

System.exit();

}

Easter EggEaster Egg

Page 23: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

EXTENSIONS FOR SECURITY ANALYSIS

Page 24: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

31 bug patterns from “CERTOracle Secure Coding Standardfor Java”

• MSC01-J. Do not use insecure or weakcryptographic algorithms

• MET04-J. Ensure that constructors do notcall overridable methods

• SER10-J. Do not serialize direct handles tosystem resources

• . . .

5 further common bug patterns

• SQL Injection

• HTTP Response Splitting

• Command Injection

• . . .

New FindBugs detectors to improve reviewNew FindBugs detectors to improve reviewFocus on security issues

31 bug patterns from “CERTOracle Secure Coding Standardfor Java”

• MSC01-J. Do not use insecure or weakcryptographic algorithms

• MET04-J. Ensure that constructors do notcall overridable methods

• SER10-J. Do not serialize direct handles tosystem resources

• . . .

5 further common bug patterns

• SQL Injection

• HTTP Response Splitting

• Command Injection

• . . .

Page 25: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

public void inject(Statement s, String input) throwsSQLException {

s.execute("SELECT * FROM products WHERE id = " + input);

}

SQL Injection :: Java-CodeSQL Injection :: Java-Code

public void inject(Statement s, String input) throwsSQLException {

s.execute("SELECT * FROM products WHERE id = " + input);

}

Page 26: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Javapublic void inject(java.sql.Statement, java.lang.String) throws

java.sql.SQLException;

Bytecode:0:aload_1

1:new #23; //class java/lang/StringBuilder

4:dup

5:ldc #25; //"SELECT * FROM produkte WHERE id ="

7:invokespecial #27; //Method

10: aload_2

11: invokevirtual #30; //Method

14: invokevirtual #34; //Method

17: invokeinterface #38, 2; //java/sql/Statement.execute:(Ljava/lang/String;)Z

22: pop

23: return

SQL Injection :: Java-BytecodeSQL Injection :: Java-BytecodeJavapublic void inject(java.sql.Statement, java.lang.String) throws

java.sql.SQLException;

Bytecode:0:aload_1

1:new #23; //class java/lang/StringBuilder

4:dup

5:ldc #25; //"SELECT * FROM produkte WHERE id ="

7:invokespecial #27; //Method

10: aload_2

11: invokevirtual #30; //Method

14: invokevirtual #34; //Method

17: invokeinterface #38, 2; //java/sql/Statement.execute:(Ljava/lang/String;)Z

22: pop

23: return

Page 27: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

FindBugs detector hierarchyFindBugs detector hierarchy

FindBugs

+ Easily extensible+ OpenSource

− Only Java− Weak Taint Tracking

FindBugs

+ Easily extensible+ OpenSource

− Only Java− Weak Taint Tracking

Page 28: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

if (fullQualifiedMethodName.equals("java.sql.Statement.execute")) {

ConstantFrame frame =getContext().getConstantDataflow(method).getFactAtLocation(location);

ConstantPoolGen cpg = buildConstantPoolGen(method);

int numArguments = frame.getNumArguments(instruction, cpg);

Constant value = frame.getStackValue(numArguments - 1);

if (!value.isConstant()) {

// Found possible SQL Injection

}

}

SQL Injection: Findbugs DetectorSQL Injection: Findbugs Detectorif (fullQualifiedMethodName.equals("java.sql.Statement.execute")) {

ConstantFrame frame =getContext().getConstantDataflow(method).getFactAtLocation(location);

ConstantPoolGen cpg = buildConstantPoolGen(method);

int numArguments = frame.getNumArguments(instruction, cpg);

Constant value = frame.getStackValue(numArguments - 1);

if (!value.isConstant()) {

// Found possible SQL Injection

}

}

Page 29: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

• 3 Installations:

• FindBugs without Plugins

• FindBugs + fb-contrib

• FindBugs + OPTIMAbit detectors

• OPTIMAbit detectors:

• XPath Injection

• Command Injection

• Insecure Cryptography

WebGoat with OPTIMAbit DetectorsWebGoat with OPTIMAbit DetectorsNew detectors find more bugs, but also more false positives

Installation ProblemTypesDetected

TruePositives

FalsePositives

No Plugins 3 15 0

• 3 Installations:

• FindBugs without Plugins

• FindBugs + fb-contrib

• FindBugs + OPTIMAbit detectors

• OPTIMAbit detectors:

• XPath Injection

• Command Injection

• Insecure Cryptography

fb-contrib 4 20 0

OPTIMAbitDetectors

8 117 16

SQL Injection: 14HTTP Response Splitting: 2

Page 30: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Practical issues in selecting a toolPractical issues in selecting a toolTopic Comment

Support for multiple Languages •Java/C#: very good•Objective C, JavaScript: weak•COBOL, PL1, XSLT: effectively nonexistent

Analyze source and/or binaries •Binaries need compileable project•Compiled active pages can be linked to code.

IDE IntegrationBuild Management

•How easy is it to integrate a process intodevelopment?

Framework Support •Data flow analysis requires knowing „Sources“and „Sinks“.•Input methods for frameworks.•Validators for frameworks

Page 31: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

CODE REVIEW AS A PROCESS

Page 32: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Secure SDLC via OpenSAMMSecure SDLC via OpenSAMM12 Security Practices

Idea: Perform SDLC Benchmark on your company and compare withothers (anonymously)

Page 33: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Scenario: Local Review (Worst Case)Scenario: Local Review (Worst Case)- Developers are

overloaded with tooloutput

- No central learning orfeedback

- No independent review

- Unstructured

IDE

Developers

Code

AnalysisTool

Analysis

- Developers areoverloaded with tooloutput

- No central learning orfeedback

- No independent review

- Unstructured

QualityRules

AnalysisTool

Requirements

Page 34: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Scenario: Expert Review TeamScenario: Expert Review Team

+ Developers see nofalse positives

+ Central learning &feedback

+Independent review

+ Structured

Code

Developers

Tickets &Feedback

Review &Analyse

Entwicklung

+ Developers see nofalse positives

+ Central learning &feedback

+Independent review

+ Structured AnalyseTool

Review Team

Tickets &Feedback

Review &Analyse

Update, Filter,Management

Page 35: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

CONCLUSIONS

Page 36: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Scales well for large projects

Many tools available

Repeatable results

Very good for finding simplepatterns

Hard to find complex problemssuch as authentication,authorization and access control.

High numbers of false positives.

Frequently can't findconfiguration issues, since theyare not represented in the code.

Static Analysis: Advantages/DisadvantagesStatic Analysis: Advantages/DisadvantagesAdvantages Disadvantages Scales well for large projects

Many tools available

Repeatable results

Very good for finding simplepatterns

Hard to find complex problemssuch as authentication,authorization and access control.

High numbers of false positives.

Frequently can't findconfiguration issues, since theyare not represented in the code.

Page 37: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

ConclusionsConclusions

Static analysis is a powerful method for examining codethat can detect many problems that human reviewerswould not find.

Static analysis is becoming a standard part of the SDLC.

The quality of the results depends strongly on the tools,code type and reviewer.

Setting up a code review system at the enterprise levelrequires substantial effort and expertise.

Static analysis is a powerful method for examining codethat can detect many problems that human reviewerswould not find.

Static analysis is becoming a standard part of the SDLC.

The quality of the results depends strongly on the tools,code type and reviewer.

Setting up a code review system at the enterprise levelrequires substantial effort and expertise.

Page 38: Securing Applications with Code Review Dr. Bruce … (DB... · Securing Applications with Code Review Dr. Bruce Sams ... null pointer, endless loop, ... exist at a given code location.

Vielen Dank

für Ihre Aufmerksamkeit

Dr. Bruce Sams [email protected]

Vielen Dank

für Ihre Aufmerksamkeit

Dr. Bruce Sams [email protected]