Secure Coding
Security Principles:
Do Not Mix Code and Data: Prevent injection attacks.
SD3: Secure by Design, Default, Deployment.
Minimize Attack Surface: Limit ports, services, privileges, and dynamic content.
Employ Secure Defaults: Use safe settings as defaults.
Least Privilege and Separation of Privilege: Ensure minimal access rights and separation of roles.
Plan for Failure: Design systems to handle failures securely.
Fix Security Issues Correctly: Address root causes, not just symptoms.
Learn from Mistakes: Continuously improve security practices.
Secure Design Principles
Economy of mechanism:
Keep the design as simple and small as possible to reduce the chance of errors and vulnerabilities.
Fail-safe defaults:
Base access decisions on permission rather than exclusion to ensure security by default.
Complete mediation:
Every access to every object must be checked for authority at the time of access to prevent unauthorized actions.
Open design:
The design and code should not be secret. The secrecy should be in the data, like passwords or cryptographic keys, to ensure transparency and trust.
Separation of privilege:
Require multiple conditions to grant access, ensuring it’s safer if two parties need to agree on a decision rather than one alone.
Least privilege:
Operate with the minimal set of powers necessary to complete a task, reducing potential damage from exploits.
Least common mechanism:
Minimize the subsystems shared between or relied upon by mutually distrusting users to reduce security risks.
Psychological acceptability:
Design security systems to be user-friendly to ensure they are used correctly and consistently.
Work factor:
Compare the cost of circumventing the security mechanism with the resources of a potential attacker to ensure security measures are effective and efficient.
Compromise recording:
Record that a compromise of information has occurred to detect breaches and respond appropriately.
Securing Workflow:
Principles:
Least Privilege: Grant only necessary permissions to users and processes.
Defense in Depth: Employ multiple layers of security controls.
Background Checks: Verify personnel handling sensitive data.
Physical Security: Secure hardware and physical access to systems.
Building Securely:
General Principles:
Build engineering as part of software development.
Builds are iterative; the first build often fails.
Projects should align with established build processes.
Security Tools:
SAST (Static Application Security Testing): Analyze source code for vulnerabilities.
DAST (Dynamic Application Security Testing): Analyze running applications for vulnerabilities.
SCA (Software Composition Analysis): Analyze open-source components for security and license compliance.
Secret Management:
Avoid storing secrets in version control.
Ensure secure handling of secrets in build logs.
Use OAuth, Personal Access Tokens, or Certificates for third-party tool authentication.
SSO (Single Sign-On): Uses SAML for secure, attribute-based authentication.
Dependency Security:
Regularly scan and update dependencies to mitigate vulnerabilities.
Secure Deployment:
Immutable Server: Servers that cannot be changed post-deployment.
Containerization:
Use containers for isolated, consistent environments.
Containers share the host OS kernel; hybrid modes (e.g., Hyper-V Isolation) add security layers.
Deployment Tools:
Octopus Deploy: Automates and secures deployment processes.
Making Security Observable:
Insecurity through Obscurity: Avoid hiding security issues; face and fix them.
Logging and Monitoring: Use tools like ELK (Elastic Search, LogStash, Kibana) or Splunk for comprehensive logging and analysis.
Common Insecure Coding Practices:
Copy-Paste Code: Avoid reusing insecure code.
Hardcoding Credentials: Avoid storing sensitive information like passwords, API keys, database connection strings directly in code.
Trusting User Input: Failing to validate or sanitize user input can lead to injection attacks.
Inadequate Authentication and Authorization: Weak implementation of auth mechanisms.
Insecure Use of Cryptographic Functions: Using outdated or weak cryptographic algorithms or improperly implementing cryptographic functions
Insecure Error Handling: Revealing sensitive information in error messages or logs.
Insecure Session Management: Using predictable session tokens, not invalidating sessions on logout, or not implementing session timeout mechanisms.
Misconfiguration of Security Headers
Insecure Deserialization
Failing to Apply Patches and Updates
Trusting Insecure SSL Certificates: Verify domain match, validity, and trustworthiness of certificates.
Last updated