Secure Code Review Java
Secure Code Review Java
for
Government, PSUs and Critical Infrastructure companies
Jaykishan Nirmal
Consultant, Trainer and Forensic Investigator
Aujas Confidential
Disclaimer
Aujas Confidential
Agenda
Aujas Confidential
Disclaimer
Hence, Whatever I say, may not be “right” but I think, it is “real” and “practical”.
Aujas Confidential
Sun Tzu
“如果你知道敌人知道,你不必担心的结
果, 很多的 战役。如果你知道你自己而
不是敌人,取得的每一个胜利你同样会遭
受失败。如果你知道无论是敌人还是自己,
你会屈服于在每一个战役。 “
孙子兵法-孙子兵法
Aujas Confidential
Sun Tzu – Chinese Military General
every battle.”
Aujas Confidential
Security
Aujas Confidential
What is Security?
Aujas Confidential
Security Terminology
Aujas Confidential
Application Security
Aujas Confidential
Some Statistics
• A one million line of code systems typically contains 1,000-5,000 defects when
shipped.
1 http://www.sei.cmu.edu/tsp/tsp-security.html
Aujas Confidential
SANS Common Coding Errors
Aujas Confidential
Application Security Trends : Q3-Q4 2008
Aujas Confidential
Software Development – Perfect World
Aujas Confidential
Software Development – Real World
Aujas Confidential
Cost Matters!
Aujas Confidential
Why to Worry
Cost
Aujas Confidential
Few Millions SQL Injection Attack
Aujas Confidential
Application Security & CIA
Aujas Confidential
Core Principles of Security
Confidentiality
Availability Integrity
Aujas Confidential
What is CIA?
• Confidentiality
Confidentiality means prevention of disclosure of information to
unauthorized individuals or systems.
• Integrity
Integrity means data cannot be modified without authorization
• Availability
Availability means Information should be available whenever needed or
requested.
Aujas Confidential
• Authenticity
It is also important for authenticity to validate that both parties involved
are who they claim they are
• Non-repudiation
In law, non-repudiation implies one's intention to fulfill their obligations to
a contract.
It also implies that one party of a transaction can not deny having received
a transaction nor can the other party deny having sent a transaction.
Aujas Confidential
Secure Code Review
Aujas Confidential
Definition
Aujas Confidential
Secure Code Review Objectives
Aujas Confidential
Then Start !
Aujas Confidential
Bug Vs. Flaw
Aujas Confidential
Aujas Confidential
Aujas Confidential
Aujas Confidential
Methodology
Application Understanding
Threat Modeling
Gap Analysis
Reporting
Aujas Confidential
Understand
Code
Context
Audience
Importance
Aujas Confidential
Threat Modeling
Injection Flaws
Cross Site Scripting
Malicious File Execution
Insecure Direct Object Reference
Cross Site Request Forgery (CSRF)
Information Leakage and Improper Error Handling
Broken Authentication and Session Management
Insecure Cryptographic Storage
Insecure Communications
Failure to restrict URL Access
Aujas Confidential
Way Around + Checklist
• Multiple-Pass Approach
• Keyword Search Approach
Aujas Confidential
Keyword Search Approach
javax.servlet.ServletOutputStream. ObjectInputStream
print PipedInputStream
javax.servlet.jsp.JspWriter.print StreamTokenizer
java.io.PrintWriter.print getResourceAsStream
java.io.FileReader
java.io.FileWriter
Legacy Methods
java.io.RandomAccessFile
printf java.io.File
strcpy java.io.FileOutputStream
Aujas Confidential
Error Handling Input Output Streams
catch{ Java.io
Finally FileInputStream
ObjectInputStream
FilterInputStream
PipedInputStream
SequenceInputStream
StringBufferInputStream
BufferedReader
ByteArrayInputStream
CharArrayReader
Aujas Confidential
Servlets Servlets Servlets
Pair Programming
Team Review
Peer Review
Individual Review
Aujas Confidential
Pair Programming
Aujas Confidential
Team Code Review – Formal Team
5 Roles should be –
Moderator
Narrator/Reader
Author
Subject Matter Expert
Recorder
Aujas Confidential
Focus is important!
Aujas Confidential
Rapid Peer Reviews
Aujas Confidential
Individual Review
Aujas Confidential
Secure Code Review – How to Start with
Formal Review Team should know what common security bugs look like
Aujas Confidential
How to Report
Description of Vulnerability
Severity
Complexity
Impact
Affected URL(s)/Page(s)
Line No. of Vulnerable Code
Recommendations
References
Aujas Confidential
Aujas Confidential
Spot the Bug!
Aujas Confidential
Spot the Bug!
Aujas Confidential
Spot the Bug!
int x = 3;
if (x==5) {}
else if (x<9)
{
System.out.println("x is less than 9");
}
else if (x<6)
{
System.out.println("x is less than 6");
}
else
{
System.out.println("else");
}
Aujas Confidential
Spot the Bug !
int x = 2, y = 3;
if (x == y)
if (y == 3)
x = 3;
else
x = 4;
Aujas Confidential
Spot the Bug !
Aujas Confidential
Spot the Bug !
}
public String getFirstName()
{
return this.firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
}
Aujas Confidential
Spot the Bug !
Aujas Confidential
Spot the Bug !
Aujas Confidential
Spot the Bug !
Aujas Confidential
Spot the Bug !
Aujas Confidential
Spot the Bug !
public void doPost(HttpServletRequest req,…) ,
} // end doPost
Aujas Confidential
Spot the Bug!
protected void doPost(HttpServletRequest req, HttpServletResponse res) {
try {
String username = req.getParameter(“USERNAME”);
String password = req.getParameter(“PASSWORD”);
try {
Connection connection = DatabaseUtilities.makeConnection();
PreparedStatement statement = connection.prepareStatement
("SELECT * FROM user_system_data WHERE user_name = ? AND password = ?”);
statement.setString(1,username);
statement.setString(2,password);
ResultSet results = statement.executeQuery(query);
results.first();
if (results.getString(1).equals(“”)) ,
s.setMessage("Invalid username and password entered.");
return (makeLogin(s));
} // end results check
} catch (Exception e) {}
// continue and display the page
if (username != null && username.length() > 0) {
return (makeUser(s, username, "PARAMETERS"));
} // end username test
} catch (Exception e) {
s.setMessage("Error generating " + this.getClass().getName());
} // end try/catch
Aujas Confidential
return (makeLogin(s));
Spot the Bug !
Aujas Confidential
protected void doPost(HttpServletRequest req, HttpServletResponse res) {
try {
String username = req.getParameter(“USERNAME”);
String password = req.getParameter(“PASSWORD”);
try {
Connection connection = DatabaseUtilities.makeConnection();
PreparedStatement statement = connection.prepareStatement
("SELECT * FROM user_system_data WHERE user_name = “ + username +
AND password = ” + password);
ResultSet results = statement.executeQuery(query);
if(results.next())
{
successLogin();
}
} // end results check
catch (Exception e)
{
Aujas Confidential
Spot the Bug !
protected void doPost(HttpServletRequest req, HttpServletResponse res) {
String query =
"SELECT userid, name FROM user_data WHERE accountnum = '"
+ req.getParameter(“ACCT_NUM”)
+ “’”;
PrintWriter out = res.getWriter();
// HTML stuff to out.println…
try {
connection = DatabaseUtilities.makeConnection(s);
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery(query);
while (results.next ()) {
out.println("<TR><TD>“ + rset.getString(1) + “</TD>”);
out.println("<TD>“ + rset.getString(2) + “</TD>”);
} // end while
} catch (Exception e) {
// exception handling…
} // end catch
} // end doPost
Aujas Confidential
Spot the Bug !
if (session.getCurrentUser().isAdmin())
{
MenuList.add("View Profile ","/jsp/Profile.do?action=view&id=" + Id);
MenuList.add("Edit Profile","/jsp/Profile.do?action=edit&id=" + Id);
MenuList.add("Delete Profile","/jsp/Profile.do?action=delete&id=“ + Id);
}
else
{
MenuList.add("View Profile","/jsp/Profile.do?action=view&id=" + Id);
}
Aujas Confidential
Spot the Bug !
Try
{
ElevatePrivilege();
ReadSecretFile();
LowerPrivilege();
}
Catch (Exception e)
{
CatchException();
}
Aujas Confidential
Is there anything wrong with error Msgs ?
Aujas Confidential
Spot the Bug!
try {
DataObject data = GetLoginDetails();
//..
if(data.success())
Log_Function(data);
}
Catch {}
Aujas Confidential
Spot the Bug ! – FinalPayment.jsp
<html>
<script>
function purchase(ids, price) {
if(validate())
{
document.forms['payment'].ids.value = ids;
document.forms['payment'].price.value = price;
document.forms['payment'].submit();
}}
</script>
Aujas Confidential
Authentication
Authorization
Cookie Management
Data Validation
Error Handling/Information Leakage
Aujas Confidential
Static Code Analysis
Aujas Confidential
Stastics
Aujas Confidential
Static Analysis Tools
Advantages -
Can scan large amount of code
Results are consistent
Identify common security mistakes
Coverage is possible maximum
Disadvantages-
Do not find all security flaws
So many False Positives
Sometime may provide false sense of security
Aujas Confidential
Best Hybrid Approach
Automated + Manual
Aujas Confidential
Dynamic Code Analysis
Tools like –
Coverity etc.
Aujas Confidential
Dynamic Code Analysis
Advantages
Runtime Defect Detection
Improve Security of Multi-Threaded Applications
Control Multi-core Complexity
Disadvantages
Much more complex to work with
Cannot guarantee the full coverage of the source code, as is runs
based on user interaction or automatic tests
Aujas Confidential
Automated Vs. Manual Review Approach
Aujas Confidential
References
• OSSTMM
http://www.osstmm.org
• OWASP
http://www.owasp.org
• OSVDB
http://osvdb.org/
•
• CVE
http://cve.mitre.org/
• Secunia
http://www.secunia.com
Aujas Confidential
References
Aujas Confidential
Thanks
Aujas Confidential