Enterprise Security API (ESAPI) Java Java User Group San Antonio Jarret Raim June 3 rd, 2010
What is it? ESAPI (The OWASP Enterprise Security API) is a free, open source, web application security control library that makes it easier for programmers to write lower-risk applications. The ESAPI libraries are designed to make it easier for programmers to retrofit security into existing applications. The ESAPI libraries also serve as a solid foundation for new development.
Who cares?
How Does it Work? Allowing for language-specific differences, all OWASP ESAPI versions have the same basic design: There is a set of security control interfaces. They define for example types of parameters that are passed to types of security controls. There is a reference implementation for each security control. The logic is not organization specific and the logic is not application specific. An example: string based input validation. There are optionally your own implementations for each security control. There may be application logic contained in these classes which may be developed by or for your organization. An example: enterprise authentication.
There are several supported languages Java EE PHP Classic ASP.NET Coldfusion Python JavaScript Haskell Force.com And they have a plan. Maybe.
Tyranny of Choice Write Spring Custom Java Jasypt Java Code Pattern URL Commons xml-enc EncoderLog4j Validator Cryptix JAAS JCE ACEGI Stinger Struts BouncyCastle Reform Anti-XSS Many xml-dsig HDIV Java Logging More Standard Control
Vulnerability Theory Threat Agent Vector Vulnerability Control Technical Impact Business Impact Vector Business Impact Vector Vulnerability Control Vector Vulnerability Missing Control Asset Business Impact Vector Vulnerability Function Business Impact Asset Vector Vulnerability Control
Where do Vulnerabilities Come From? Missing Controls Lack of encryption Failure to perform access control Broken Controls Weak hash algorithm Fail open Ignored Controls Failure to use encryption Forgot to use output encoding ESAPI Solves Missing Broken Process Solves Ignored
Authenticator User AccessController AccessReferenceMap Validator Encoder HTTPUtilities Encryptor EncryptedProperties Randomizer Exception Handling Logger IntrusionDetector SecurityConfiguration Custom Enterprise Web Application Enterprise Security API Existing Enterprise Security Services/Libraries
Encoder Typical output in most web frameworks leads to XSS and CSRF vulnerabilities. The ESAPI encoder allows direct encoding depending on context. Web (HTML, JavaScript, CSS) Databases (MySQL, Oracle) URL Shells (Unix, Windows) XML LDAP Also provides a canonnicalize method to remove any encodings. <p>hello, <%=name%></p> <p>hello, <%=ESAPI.encoder().encodeForHTML(name)%> </p>
User Controller Business Functions Data Layer Backend isvalidcreditcard isvaliddatafrombrowser isvaliddirectorypath isvalidfilecontent isvalidfilename isvalidhttprequest isvalidlistitem isvalidredirectlocation isvalidsafehtml isvalidprintable safereadline encodeforjavascript encodeforvbscript Validator Encoder encodeforurl Canonicalization Double Encoding Protection Sanitization Normalization encodeforhtml encodeforhtmlattribute encodeforldap encodefordn encodeforsql encodeforxml encodeforxmlattribute encodeforxpath
Validator EXAMPLE: <script>alert(document.cookie)</script> ESAPI.validator().getValidInput(String context,string input,string type,int maxlength,boolean allownull,validationerrorlist errorlist) assertisvalidhttprequest() assertisvalidhttprequestparameterset() assertisvalidfileupload() getvalidcreditcard() getvaliddate() getvaliddirectorypath() getvaliddouble() getvalidfilecontent() getvalidfilename() The Validator interface defines a set of methods for canonicalizing and validating untrusted input. Returns booleans as not all validation problems are security issues. Invalid input will generate a descriptive ValidationException which will be stored in the ValidationErrorList Input that is clearly an attack will generate a descriptive IntrusionException
Validator Example ESAPI provides the ValidationRule and Validator interfaces. Implement your own validators for your data. Reference Regex codes in the ESAPI properties from generic to specific.
Global Validate Canonicalize Specific Validate Any Interpreter Any Encoding Sanitize Web Service Controller Database Mainframe User Business Functions Data Layer Etc User Interface Set Character Set Encode For HTML File System Canonicalize Validate
Authenticator Interface with a simple, file based example implementation Log In / Log Out Password Verification Create User Password Generation Change Password Expirations Logging Per User Session Anonymous User Locale Roles Disable / Enable Locked / Unlocked CSRF Tokens Last Login Last Invalid Login Password Age Screen Name Failed Log In Count Last Logged in Host
Authentication Access Control Logging Intrusion Detection User Controller Business Functions Data Layer Backend Users ESAPI Note that the ESAPI project does not have out of the box support for projects like Spring, but can be made to work.
isauthorizedforurl isauthorizedfordata isauthorizedforfunction isauthorizedforservice Web Service Controller Database Mainframe User Business Functions Data Layer Etc isauthorizedforfile User Interface File System isauthorizedforfunction
Encryption Encryption failures can lead to violations of the Big Three Confidentiality Integrity Availability (maybe) Encryption is surprisingly difficult to get right. You are probably doing it wrong right now. The Encryptor interface provides a set of methods for performing common encryption, random number, and hashing operations. encrypted = ESAPI.encryptor().encrypt( decrypted ); decrypted = ESAPI.encryptor().decrypt( encrypted );
User Controller Business Functions Data Layer Backend Integrity Seals Encrypted Properties Encryptor Encryption Strong GUID Digital Signatures Safe Config Details Random Tokens Timestamp Salted Hash
Direct Object Reference Occurs when a developer exposes a reference to an internal implementation object, such as a file, directory, database record, or key, as a URL or form parameter. Fix is to generate suitably random garbage, then internally map that to the appropriate IDs. Doing this is surprisingly annoying, especially if there are no sessions. Not really scalable friendly. ESAPI provides a random access map which also helps protect against CSRF. String directreference = "This is a direct reference."; RandomAccessReferenceMap instance = new RandomAccessReferenceMap(); String ind = instance.adddirectreference((object)directreference);
ref=jfo8we4oji Acct:9182374 Web Service Database User Access Reference Map Mainframe Etc Report123.xls File System Indirect References Direct References
Logging & Exceptions For many applications, logging is only used to detect application errors. Is usually geared to solving problems in development Hopefully with an eye to production. ESAPI provides a logging implementation that integrates with the security substructure. Logs security exceptions that are ESAPI generated with identify information Can be used by normal business code to log security exceptions or just log information with identify Integrates an intrusion detection system that can respond to different types of intrusions by disabling accounts or other actions.
User Controller Business Functions Data Layer Backend User Message (no detail) Enterprise Security Exceptions Logger Log Message (w/identity) AccessControlException AuthenticationException AvailabilityException EncodingException EncryptionException ExecutorException IntegrityException IntrusionException ValidationException Intrusion Detector Configurable Thresholds Responses Log Intrusion Logout User Disable Account
Handling HTTP Many applications make heavy use of HTTP for functionality Classic ASP uses redirects for flow control, error handing, etc. The use of data from the request accounts for most web security defects ESAPI provides methods to interact with the request Helper methods for encryption CSRF tokens Etc. Deals with Characters Sets and Encodings
User Controller Business Functions Data Layer Backend Add Safe Header No Cache Headers Set Content Type Add Safe Cookie Kill Cookie Change SessionID CSRF Tokens HTTP Utilities issecurechannel Safe Request Logging Safe File Uploads sendsafeforward sendsaferedirect Encrypt State in Cookie Hidden Field Encryption Querystring Encryption
OWASP Top Ten 2007 OWASP ESAPI A1. Cross Site Scripting (XSS) A2. Injection Flaws A3. Malicious File Execution A4. Insecure Direct Object Reference A5. Cross Site Request Forgery (CSRF) A6. Leakage and Improper Error Handling A7. Broken Authentication and Sessions A8. Insecure Cryptographic Storage A9. Insecure Communications A10. Failure to Restrict URL Access Validator, Encoder Encoder HTTPUtilities (Safe Upload) AccessReferenceMap, AccessController User (CSRF Token) EnterpriseSecurityException, HTTPUtils Authenticator, User, HTTPUtils Encryptor HTTPUtilities (Secure Cookie, Channel) AccessController
Special Thanks Supports OWASP and ESAPI Many of the diagrams for in the slides are from a similar presentation by Aspect.