Firefox security guidelines
Purpose
This document outlines a set of security guidelines that will generally apply to all client applications, such as Firefox and Thunderbird.
Secure Coding Principles
Ensure that the application follows the OWASP Secure Coding Principles:
- Minimize attack surface area
- Establish secure defaults
- Principle of Least privilege
- Principle of Defense in depth
- Fail securely
- Don't trust services
- Keep security simple
- Fix security issues correctly
Input Validation
- Does the application accept user input?
- Verify a sampling of input locations to ensure that reasonable maximums are in place when accepting user data
- Verify a sampling of input locations to ensure that the application allows only a defined set of acceptable characters
- Ensure that allowlisting is used instead of denylisting
- Does the application accept user input that is displayed in any way?
- Verify a sampling of input and output locations to ensure user supplied content is properly encoded in the response
Chrome JS - Dangerous Functions
Are any of the following functions used?
If so ensure they are safe and that no better alternatives are available.
Name | Risk Level | Problem | Solution |
---|---|---|---|
eval | Very High | Invokes JavaScript parser - dangerous if used with untrusted input | Avoid eval if at all possible. |
setTimeout(string, time) | Very High | Acts like eval | Use setTimeout(function, time, param1, param2, …) |
C++ - Dangerous Functions
Are any of the following functions used?
If so ensure they are safe and that no better alternatives are available.
Name | Risk Level | Problem | Solution |
---|---|---|---|
gets | Very High | No bounds checking | Do not use gets. Use fgets instead. |
strcpy | Very High | No bounds checking | strcpy is safe only if the source string is a constant and the destination is large enough to hold it. Otherwise, use strncpy. |
sprintf | Very High | No bounds checking, format string attacks | sprintf is very hard to use safely. Use snprintf instead. |
scanf, sscanf | High | Possibly no bounds checking, format string attacks | Make sure all %-directives match the corresponding argument types. Do not use '%s' directives with no bounds checking. Use '%xs' where x is the buffer size of the corresponding argument. Do not use untrusted, un-validated data in the format string. |
strcat | High | No bounds checking | If input sizes are not well-known and fixed, use strncat instead. |
printf, fprintf, snprintf, vfprintf, vsprintf, syslog | High | format string attacks | Do not use untrusted, un-validated data in the format string. If the format string can be influenced by Web content or user input, validate it for the proper number and type of %-directives before calling these functions. Make sure destination size arguments are correct. |
strncpy, fgets, strncat | Low | May not null-terminate | Always explicitly null-terminate the destination buffer. Make sure the size argument is correct. Be sure to leave room in the destination buffer to add the null character! |
URLs
- Does the application make use of untrusted data to construct URLs?
- Ensure any such data is adequately sanitized and encoded prior to use.
- Ensure any data obtained from these URLs is checked before use or storage.
- Does the application follow redirects?
- Ensure security checks are performed on redirects as well as the original request URI.
Security Controls
- Does the application implement suitable permission checks?
- Ensure the correct APIs are used where available (e.g. shouldLoad, etc.)
- Ensure the application fails securely.
Remote System Access
- Does the application access any remote systems?
- Ensure that TLS is used unless there's a very good reason not to.
- Ensure that no user information is transmitted without the user's consent.
Information Storage
- File storage
- Ensure the application checks that any files created are under allowed paths
- Are filenames generated from untrusted data?
- Ensure the data is suitably encoded
- Check files are of an acceptable type
- Check files cannot exceed reasonable size limits
- Database storage
- Ensure any untrusted information sent to the database is adequately sanitized
- Where possible, make use of type safe parameterization to prevent injection attacks
- Sensitive information
- Ensure any security sensitive or personal information is adequately protected (see Encryption section)
- Particular care must be taken around credentials (passwords, etc.) - If you're working with information of this type and you're unsure of what to do, it's always worth asking
- Logging
- Don't forget the above rules apply to logs as well as your usual application data
Encryption
- Does the application use any form of encryption?
- Are the algorithms used recognized standards?
Denial of Service
- Ensure the application protects against exhaustion of:
- System memory
- Storage
Security Warnings
- Does the application present the user with any security warnings?
- Are they clearly understandable and appropriate?
- Can untrusted data change the meaning of messages to the user?
- Can user input change the meaning of messages?
- Can user input force system messages off the visible screen?
- Can user input include special characters that can change the meaning of messages (e.g. Unicode right-to-left override U+202E)
- Can an attacker use the timing of dialogs to fool the user into clicking on something they didn't intend to?
Information Disclosure
- Does the application disclose information that could compromise the user?
- Does the application disclose any information that it does not need to?
- Does the application disclose anything that may surprise or upset the user?
Front End
- Are safe mechanisms used to create XUL and HTML UI elements?
- e.g. use createTextNode instead of innerHTML or similar
- Does the application create its own docshells (tabs, iframes)?
- Ensure you are explicit about the type of these, e.g. iframe.setAttribute("type", "content")