CrOS Developer Library: Remove duplicate security review howto.
Bug: none
Test: none
Change-Id: I0ce3da47b29b2b38da12c26bcecc5064605c4442
Reviewed-on: https://chromium-review.googlesource.com/c/website/+/5321637
Auto-Submit: James Hawkins <jhawkins@chromium.org>
Commit-Queue: Nikhil Nayunigari <nikhilcn@google.com>
Reviewed-by: Nikhil Nayunigari <nikhilcn@google.com>
diff --git a/site/chromium-os/developer-library/guides/development/security-review-howto/index.md b/site/chromium-os/developer-library/guides/development/security-review-howto/index.md
deleted file mode 100644
index 2b2cfb2..0000000
--- a/site/chromium-os/developer-library/guides/development/security-review-howto/index.md
+++ /dev/null
@@ -1,416 +0,0 @@
----
-breadcrumbs:
-- - /chromium-os/developer-library/guides
- - Chromium OS > Developer Library > Guides
-page_name: security-review-howto
-title: ChromeOS security review HOWTO
----
-
-This document describes the ChromeOS security review process. It's aimed at
-feature owners, tech leads, and product managers.
-
-## Goals
-
-The ChromeOS security review process' main goal is to ensure new features stay
-faithful to ChromeOS' security architecture. More details on what the review
-covers are described below in the [review framework] section, but at a high
-level the goal is to protect our users' data and devices. The security review
-process is designed to make sure that new features don't make it
-disproportionately easier for attackers to compromise user data or devices.
-In general, every ChromeOS feature requires a security review.
-
-## The security review process
-
-ChromeOS development is structured around four-week cycles called *milestones*.
-Every four weeks a new release branch is created, based off our main development
-branch (also known as *trunk* or *tip-of-tree*). Accordingly, a new milestone is
-pushed to ChromeOS devices every four weeks. It takes seven to eight weeks from
-the time a branch is cut to the time a new software image built from that
-branch is pushed to devices on the stable channel.
-
-A feature targeting a given milestone will be reviewed during that milestone's
-development cycle. The ChromeOS security team tracks features by looking at
-*Launch bugs* filed in [crbug.com]. **As long as the feature has an associated
-launch bug, the security team will track it**. The new launch bug template
-allows feature owners to initiate a security review by flipping the
-*Launch-Security* flag to *ReviewRequested*. The security team tracks this flag
-as well.
-
-In order to streamline the process as much as possible, make sure that the
-launch bug links to a design doc that includes a section covering the security
-implications of the feature. **The rest of this document describes what
-questions such a "Security considerations" section should answer and what
-concerns it should address**.
-
-Launch bugs include a set of cross-functional review flags, which includes the
-*Launch-Security* flag mentioned above. The security team will flip this flag
-to *Approved* after the feature owner has successfully engaged the security team
-to understand (and address or mitigate) the security implications of the
-feature. **Don't think of the security review process as an arbitrary bar set by
-the security team that you have to pass no matter what**. Instead, think of it
-as the process by which you take ownership of the security implications of the
-feature, so that you are shipping something that doesn't detract from the
-overall security posture of the product.
-
-Even if you consider that the feature is trivial, or has no security
-implications, **please refrain from flipping the security flag in the launch bug
- to *NA* or *Approved* yourself**. In most cases, features are not as trivial as
-they initially appear. More importantly, the security team uses these flags to
-track features and work on our side. We will flip the security flag to
-*Approved* when the feature is ready.
-
-Fast-track features will still require a full security review if the feature is
-modifying more than one component, where *component* can be understood as a
-single process or service. For example, if the feature is modifying two things
-that communicate over IPC, it would require a full security review. In other
-words, modifying a single component is a necessary but *not sufficient*
-condition for a feature to be fast-tracked from a security perspective. Many
-features that modify a single component are complex enough to require a full
-security review.
-
-If the feature is big or complex, or if you find yourself implementing something
-that needs to go against the recommendations in this document, please reach out
-to the security team as soon as possible. Send email to
-[chromeos-security@google.com], and try to include a design doc, even if it's
-just an early draft. **When in doubt, just reach out**. We are always happy to
-discuss feature design. You can also book [office hours] for any questions or
-discussions.
-
-The ChromeOS security team will normally not look at the implementation details
-of a feature -- there is just not enough time to read through thousands of lines
-of code each milestone. Instead, we prefer to focus on ensuring that the design
-of the feature is contributing to, rather than detracting from, the overall
-security posture of the system. The reason for this is two-fold: first, the time
-constraints mentioned before. Second is the fact that even with careful review
-bugs will likely slip through, and a sound, defensive design will ensure that
-these bugs don't end up being catastrophic. For particularly risky code we can
-always contract out a security audit.
-
-**The expectation is that the feature will be security-complete (e.g. the new
-system service will be fully sandboxed) by the time the branch is cut**. Merging
-CLs that implement security features to release branches is risky, so we avoid
-it.
-
-If the feature is enabled by default, **the security flag in the launch bug
-tracking the feature must be flipped before branch point**. This means that all
-the relevant information (e.g. a design doc with a "Security considerations"
-section) must be available well before the branch is cut, to give time for the
-security team to review the feature and flip the flag before branch point.
-
-If the feature is kept behind a flag, the security bit in the launch bug must
-be flipped before the flag is enabled by default. This means that the feature
-must be security-complete by the time the flag is enabled by default. Even in
-this case we strongly recommend tackling security work earlier rather than
-later. It's normally not possible to address security concerns in a feature
-that's complete without requiring costly refactoring or rearchitecting.
-
-In general, a feature that properly addresses the questions and recommendations
-in this document can expect to have its security flag flipped by branch point.
-
-### Life of a security review
-
-This section describes how we use launch bug labels to determine the status of a
-given launch bug and its progression through various states. It's useful context
-for feature owners to be able to request reviews and supply information properly
-and to clarify expectations on what should happen next at any point in time.
-Similarly, ChromeOS security team members find a detailed description of their
-role and responsibility in the review process:
-
-1. The process only kicks off once the *Launch-Security* flag set to
- *ReviewRequested*. If the feature isn't marked as such, it might not be
- ready for review. Feature owners are responsible for setting
- *ReviewRequested* and should make sure to supply a design doc with a
- "Security considerations" section before doing so.
-2. If the *Launch-Security* flag is set to *ReviewRequested*, the first thing
- the security reviewer will do is check for a design doc. If there isn't one,
- they will generally ask for one and flip the *Launch-Security* flag to
- *NeedInfo*. The feature owner should flip the flag back to *ReviewRequested*
- when the design doc is ready for review.
-3. If the design doc doesn't have a *Security Considerations* section, the
- security reviewer may ask for one. Offer a link to the [review framework] as
- a guide for how to write that section. Flip the *Launch-Security* flag to
- *NeedInfo*. The feature owner should flip the flag back to *ReviewRequested*
- when the design doc is ready for re-review.
-4. The security reviewer should use the [review framework] to evaluate if the
- feature is respecting security boundaries, handles sensitive data
- appropriately, etc. It's often also a good idea to consider existing
- features, in particular their security design and trade-off decisions made
- in previous reviews.
-5. If any security-relevant aspects are unclear or if there are concerns,
- the security reviewer should communicate this back to the feature owner via
- design doc comments and comment on the launch bug to clarify the security
- review status. Flip the *Launch-Security* flag back to *NeedInfo*.
-6. Security reviewers are encouraged to surface controversial
- design/implementation choices or aspects you're unsure about in the weekly
- ChromeOS security team meeting. This is useful so the rest of the team can
- suggest useful alternative angles and to provide historical context and
- high-level guidance on ChromeOS security philosophy.
-7. If necessary, the security reviewer and feature owner will iterate to
- resolve any questions or concerns. Use whatever means of communication seems
- most appropriate to make progress. For simple questions, document comments
- or email threads will work. For in-depth discussion of product requirements,
- design choices, and implications on security assessment, it's usually better
- to ask for a meeting. Note that it is generally the responsibility of the
- feature owner to drive the review process to a conclusion. However, the
- security reviewer should strive for clear communication on what remains to
- be addressed at any point in the process. As you have probably realized by
- now, the *Launch-Security* flag gets flipped between *NeedInfo* and
- *ReviewRequested* as the review progresses, always keeping track of who's
- responsible for the next action.
-8. We're aiming to acknowledge a *ReviewRequested* flag for the upcoming
- milestone within seven days. This doesn't mean the review needs to be
- completed in seven days. *ReviewRequested* means "the feature team has done
- everything they thought they had to, and now they need input from the
- security team". It doesn't mean "we solemnly swear the feature is 100%
- complete". Therefore, what we're aiming to do within seven days is to
- unblock the feature team by letting them know what the next step is. As
- explained in this list, the next step could be more documentation, or an
- updated or more robust implementation. In any of those cases, or if the
- feature is not really ready for review, flip the review flag to *NeedInfo*
- and explain what's missing.
-9. Once everything looks good, the security reviewer should flip the review
- flag to *Approved* and document conclusions and aspects that were
- specifically evaluated in the security review in a bug comment. The [review
- framework] section is useful to structure this. The information in the
- comment is intended for future reference when consulting previous security
- review decisions for guidance. Also, in case aspects of a feature are later
- found to cause security issues, it's useful to understand whether these
- aspects surfaced in the security review and the reasoning behind review
- conclusions. Note that the purpose is *not* to blame security reviewers in
- case they have missed problems, but to help our future selves understand how
- we can improve the process as needed (for example by adding specific items
- to watch out for to the [review framework]).
-10. In case the review reaches an impasse, the security reviewer shouldn't just
- flip the review flag to *NotApproved* as we're committed to engaging
- productively as much as we can. Instead, the current state of things should
- be surfaced and relevant leads be consulted to figure out a way forward.
-
-## Review framework - things to look at
-
-### Security boundaries
-
-Does the feature poke holes in existing security boundaries? This is not a good
-idea. Existing boundaries include:
-
-* Chrome renderer process to Chrome browser process: this boundary is
- traversed only with Chrome IPC or Mojo. It should not be trivial for a
- Chrome renderer process to directly manipulate or control the Chrome
- browser process. For browser-specific guidelines, check out
- [How To Do Chrome Security Reviews].
-* Chrome browser process (running as user `chronos`) to system services: this
- boundary is traversed with D-Bus. It should not be possible for the Chrome
- browser process to directly manipulate a system service or directly access
- system resources (e.g. firewall rules or USB devices).
-* ARC++ container to Chrome browser or ChromeOS system: this boundary is
- traversed with Mojo IPC. It should not be possible for the container to
- directly manipulate resources outside of the container. **Trust decisions
- should always be made outside of the container.**
-* Userspace processes to kernel: this boundary is traversed by system calls.
- It should not be possible for userspace to gain untrusted kernel code
- execution (this includes loading untrusted kernel modules). Seccomp (see
- the [sandboxing guide] for details) should be used to secure this boundary.
-* Kernel to firmware: it should not be possible for a kernel compromise to
- result in persistent, undetectable firmware manipulation. This is enforced
- by Verified boot.
-
-Are security boundaries still robust after the feature has been implemented?
-For example, a feature might be in theory respecting a boundary by implementing
-IPC, but if the IPC interface is designed so that the higher-privilege side
-implicitly trusts and blindly carries out what the lower-privileged side
-requests, then the security boundary has been weakened.
-
-Does the feature require adding new boundaries? For example, ARC++ was a
-feature that required adding a new security boundary: the ARC++ container. A
-new security boundary, while sometimes necessary to restrict what untrusted
-code can do, also adds a layer that will need to be enforced and maintained
-going forward.
-
-### Privileges
-
-* Implement the principle of least privilege: give code only the permissions
- it needs to do its job, and nothing else. E.g. if code doesn't need to be
- root, it shouldn't run as root. If it doesn't need to access the network, it
- shouldn't have access to the network.
-* See the [sandboxing guide] for more details.
-
-### Untrusted input
-
-* Prefer robust parsers, e.g. protobuf. Avoid implementing your own
- serialization and deserialization routines: buggy (de)serialization code is
- routinely the source of security bugs. These bugs are dangerous because they
- can occur on the trusted side of an IPC boundary, allowing a less privileged
- process to possibly get code execution in a more privileged process. If you
- absolutely must write custom code, the requirement for new serialization
- code is for the code to be thoroughly fuzzed (see the
- [fuzzing documentation]) or written in a memory-safe language like Rust.
-* Don't reimplement IPC using pipes or sockets, use Mojo or D-Bus. The concern
- is the same as in the previous case: hand-written IPC is brittle, and bugs
- in IPC mechanisms could allow a less privileged process to subvert the
- execution of a more privileged process, which is the definition of a
- privilege escalation bug. Refer to the [Mojo IPC security guidelines] for
- more details.
-* Any code handling non-trivial untrusted data must be fuzzed to ensure its
- robustness. See our [fuzzing documentation] for more information.
-
-### Sensitive data
-
-* Does the feature handle sensitive user data? Maintain ChromeOS's
- guarantee: user data is never exposed at rest (i.e. when the user is not
- logged in or when the device is off), and different users on the same device
- cannot access each other's data.
-* User data stored by the Chrome browser in the user's home directory is
- protected by ChromeOS's user data encryption. If the feature accesses this
- data from outside a Chrome session (e.g. not running as the `chronos`) user,
- how is it making sure that the data will not be saved to disk unencrypted?
-* Does the feature expose existing sensitive data to less privileged
- contexts? This is dangerous, and should be avoided. If necessary, consider
- filtering the data that is made available, allowing only reading the
- minimum amount of data required, disallowing modifications, and take care
- to not allow cross-user modification of user data.
-
-### Attack surface
-
-* What can an attacker gain by triggering the code added for the feature? For
- example, new code might be calling a previously unused system call with
- parameters received directly from another process over IPC. If that other
- process is compromised, and the new code doesn't validate these parameters,
- the feature just added that system call as attack surface exposed to all
- processes that can access the IPC endpoint.
-* Are new libraries being used and what new packages are pulled into the
- image? If so, how confident are we about the quality of the code in the
- library? Do the upstream maintainers patch security bugs? Will the team
- adding the feature be responsible for updating the library when security
- bugs get discovered? Library code is subject to the same (or arguably more)
- scrutiny than code written by ChromeOS engineers: is it robust against
- malformed or malicious input? Can it be fuzzed?
-* Is the code accessible to remote attackers? Is it exposed directly over the
- network? If so, consider whether this is really necessary, and whether it
- can be mitigated with firewall rules or other restrictions.
-
-### Implementation robustness
-
-* Does the code use threads? Are you confident there are no race conditions?
- Consider using the most straightforward threading or multi-process
- constructs you can (like `libbrillo`'s [BaseMessageLoop]).
-* Does the code implement a state machine or a protocol? Will an attacker
- sending packets in the wrong order break things? Write the code in a
- defensive way, to be robust in the face of malicious input and to *fail
- closed*, this is, to fail by denying access or by refusing to carry out a
- request, instead of the opposite.
-* Are there other assumptions prone to accidentally breaking in the future?
- This can include assuming an IPC is only ever called with certain
- parameters, or assuming a certain process is always present on the system,
- or that the state on disk for a file or a directory is always the same.
- If so, add a test to enforce the assumption, and revisit your code to be
- robust in the event of a broken expectation.
-
-### Cryptography
-
-* If the feature is using cryptography for integrity, confidentiality, or
- authentication, reach out to the security team. You can always find us at
- [chromeos-security@google.com]. We can put you in contact with crypto
- experts to make sure that your use of cryptography is correct.
-* There should be no need for features to roll their own crypto. Use
- well-established cryptographic libraries like BoringSSL or OpenSSL.
-* Please check any dependencies you add for implementations of cryptographic
- algorithms or protocols and flag these to the security team before bringing
- in the dependency. This includes e.g. TLS client implementations, which are
- highly non-trivial to get right, and incur significant maintenance cost.
-* Prefer to use high-level primitives. E.g. don't take an AES-CBC
- implementation and add your own padding, use a high-level primitive that
- simply encrypts and decrypts data provided a key.
-* If you're using keys, what is the key management story? Where are keys
- kept? Do they need to be hardware-protected?
-* Should key management tie in with our signing infrastructure? This is
- important if the keys are being used to sign code or other artifacts.
-* Do we know how to rotate keys in case there's a compromise? If the feature
- is using cryptographic keys extensively, you must write a key rotation
- doc as part of the feature.
-* For a quick primer on cryptography best practices, check out this
- [newer list of cryptographic right answers], as well as this
- [older reference of cryptographic right answers]; but remember to reach out
- to the security team to validate your design.
-
-### Metrics
-
-For features that are security-sensitive, strive to add metrics that allow
-tracking whether the feature is functioning as expected. You should be able to
-answer whether the expectations you had regarding the state or behavior of
-devices in the field were correct or not. For example:
-
-* If you're adding a feature that verifies signatures or hashes, either from
- the network or on disk, report the result of the verification.
-* More generally, if you're adding a feature that needs to check the validity
- of data, consider reporting when you encounter malformed data.
-* If you're adding a feature that depends on device state, like converting
- a file on disk to an updated format, consider reporting both the state
- before the feature, as well as the result of the operation.
-
-The objective of this reporting is to identify blind spots in our security
-posture in the field. If a security-sensitive feature is failing, we should know
-about it. It's possible that we could learn about individual instances of the
-failure, maybe via bug reports, but without metrics we cannot find out about
-the *extent* of the problem.
-
-[UMA] is the metrics infrastructure used in Chrome and ChromeOS. You can report
-metrics both from the Chrome browser and from system services.
-
-### Philosophy
-
-Overall ChromeOS security architecture is inspired by a set of principles that
-help us make consistent decisions. They guide us towards solutions that achieve
-security trade-offs which make sense in the world our users live in. As part of
-the security review process, we evaluate whether new features strike the right
-balance with respect to our principles. This is not exact science - we often
-need to balance legitimate interest to add a new feature with slight
-deterioration of ChromeOS's overall adherence to the principles. In case of
-obvious conflicts, it is important though to explore whether the feature in
-question can be implemented in an alternative way that is more in line with the
-principles. If a better design is identified, please do make the effort to
-seriously consider it. Design improvements are a triple win: The feature team
-produces a shinier feature, users get something that works better, and the
-security team has fewer things to worry about.
-
-These are our security principles:
-
-* *Secure by default*: All ChromeOS features should offer adequate security
- without requiring the user to take further action. We don't ever want to end
- up in a situation where people seriously follow "10 absolutely essential
- ChromeOS security tweaks" guide documents on the internet.
-* *Don't scapegoat the user*: Pushing security decisions on the user is
- sometimes unavoidable, in particular where there is no viable secure default
- that works for everyone. We want to avoid asking the user security-relevant
- questions as much as possible though and just figure out based on the
- situation what is the correct security choice for them. Are there other
- settings or decisions that have already been taken that can guide the
- decision? Can we identify relevant user segments automatically?
-* *Defense in depth*: Layered security defenses are industry standard now. All
- features must be evaluated under the assumption that one or more security
- boundaries are broken by attackers. What would be the correct system
- behavior under that scenario?
-* *The perfect is the enemy of the good*: There's always room for improvement
- when it comes to security features. Striving for ideal security is not only
- impossible in general, but often prevents or delays security improvements
- that are meaningful but do leave gaps in practice, so we need to strike a
- balance. When in doubt, evaluate choices against attack scenarios to
- determine how worthwhile a given security defense is.
-* *Protect user data, be transparent*: Our ultimate goal is to protect our
- users' data. Security features help with that, but we must acknowledge that
- user behavior will always be part of the equation. In the light of that, we
- aim to be transparent so users are aware when they share their data or
- otherwise open it up to additional exposure. There is tension here to
- "secure by default" and *don't scapegoat the user* - this is intentional :-D
-
-[sandboxing guide]: sandboxing.md
-[crbug.com]: https://crbug.com
-[chromeos-security@google.com]: mailto:chromeos-security@google.com
-[office hours]: https://goto.google.com/cros-security-office-hours
-[chromiumdash]: https://chromiumdash.appspot.com/schedule
-[fuzzing documentation]: testing/fuzzing.md
-[BaseMessageLoop]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/libbrillo/brillo/message_loops/base_message_loop.h
-[newer list of cryptographic right answers]: http://latacora.singles/2018/04/03/cryptographic-right-answers.html
-[older reference of cryptographic right answers]: https://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
-[review framework]: #review-framework-things-to-look-at
-[How To Do Chrome Security Reviews]: https://docs.google.com/document/d/1JDC411NquvDGTQjQbtQSzHtBaQyCFMDTAAQZGifdmuE/edit
-[Mojo IPC security guidelines]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/mojo.md
-[UMA]: https://g3doc.corp.google.com/analysis/uma/g3doc/home/index.md
diff --git a/site/chromium-os/developer-library/guides/index.md b/site/chromium-os/developer-library/guides/index.md
index fba0fe1..e91c223 100644
--- a/site/chromium-os/developer-library/guides/index.md
+++ b/site/chromium-os/developer-library/guides/index.md
@@ -45,7 +45,6 @@
* [Remote Trybots](/chromium-os/developer-library/guides/development/remote-trybots)
* [Rust on ChromeOS](/chromium-os/developer-library/guides/development/rust-on-cros)
* [Sandboxing ChromeOS system services](/chromium-os/developer-library/guides/development/sandboxing)
-* [ChromeOS security review HOWTO](/chromium-os/developer-library/guides/development/security-review-howto)
* [ChromiumOS Guide to Working on Branches](/chromium-os/developer-library/guides/development/work-on-branch)
## Device