Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): change the URL sanitization to only block javascript: URLs #49659

Closed
wants to merge 1 commit into from

Conversation

neuracr
Copy link
Contributor

@neuracr neuracr commented Mar 31, 2023

In modern browsers, the 'javascript:' URL scheme is the only scheme that can execute JavaScript when passed in a navigation URL context (e.g. a.href value). Validate URL shemes to only contain characters allowed in the URL specification ([a-zA-Z-+.]), and that are not javascript (case insensitive). This is not a breaking change. The URL sanitization is loosen.

PR Checklist

Please check if your PR fulfills the following requirements:

  • The commit message follows our guidelines: https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features). The documentation is already explaining the javascript: URLs are sanitized. This is still the case, and is the only scheme being sanitized.

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • angular.io application / infrastructure changes
  • Other... Please describe:
    Security change.

What is the current behavior?

The navigation URL sanitization in Angular is currently allowlist based. It allows implicit shemes, or explicit scheme oneof https?|mailto|data|ftp|tel|file|sms that are known to be always safe wrt. XSS.

Issue Number: N/A

What is the new behavior?

The new sanitization algorithm validates the scheme has characters allowed by the URL specification. It is also blocklist based and blocks the javascript scheme (non case sensitive).

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

@bjarkler
Copy link
Contributor

@jelbourn LGTM for security.

@@ -9,13 +9,14 @@
import {XSS_SECURITY_URL} from '../error_details_base_url';

/**
* A pattern that recognizes a commonly useful subset of URLs that are safe.
* A pattern that recognizes a URLs that are safe wrt. XSS in URL navigation
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: "recognizes a URLs" -> "recognizes URLs"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Copy link
Contributor

@jessicajaniuk jessicajaniuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reviewed-for: fw-core

@jelbourn jelbourn added security Issues that generally impact framework or application security area: security Issues related to built-in security features, such as HTML sanitation hotlist: google and removed detected: feature PR contains a feature commit labels Mar 31, 2023
@ngbot ngbot bot modified the milestone: Backlog Mar 31, 2023
Copy link
Member

@jelbourn jelbourn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Reviewed-for: fw-security

In modern browsers, the 'javascript:' URL scheme is the only scheme that
can execute JavaScript when passed in a navigation URL context (e.g.
`a.href` value). Validate URL shemes to only contain characters allowed
in the URL specification ([a-zA-Z-+.]), and that are not javascript
(case insensitive). This is not a breaking change. The URL sanitization
is loosen.
Copy link
Member

@pkozlowski-opensource pkozlowski-opensource left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed-for: fw-security

@pkozlowski-opensource pkozlowski-opensource added target: patch This PR is targeted for the next patch release action: merge The PR is ready for merge by the caretaker labels Apr 4, 2023
@dylhunn
Copy link
Contributor

dylhunn commented Apr 4, 2023

This PR was merged into the repository by commit b35fa73.

dylhunn pushed a commit that referenced this pull request Apr 4, 2023
#49659)

In modern browsers, the 'javascript:' URL scheme is the only scheme that
can execute JavaScript when passed in a navigation URL context (e.g.
`a.href` value). Validate URL shemes to only contain characters allowed
in the URL specification ([a-zA-Z-+.]), and that are not javascript
(case insensitive). This is not a breaking change. The URL sanitization
is loosen.

PR Close #49659
@dylhunn dylhunn closed this in b35fa73 Apr 4, 2023
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Apr 9, 2023
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@angular/animations](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fanimations/15.2.5/15.2.6) |
| [@angular/common](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fcommon/15.2.5/15.2.6) |
| [@angular/compiler](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fcompiler/15.2.5/15.2.6) |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/main/packages/compiler-cli) ([source](https://github.com/angular/angular)) | devDependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fcompiler-cli/15.2.5/15.2.6) |
| [@angular/core](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fcore/15.2.5/15.2.6) |
| [@angular/forms](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fforms/15.2.5/15.2.6) |
| [@angular/platform-browser](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fplatform-browser/15.2.5/15.2.6) |
| [@angular/platform-browser-dynamic](https://github.com/angular/angular) | dependencies | patch | [`15.2.5` -> `15.2.6`](https://renovatebot.com/diffs/npm/@angular%2fplatform-browser-dynamic/15.2.5/15.2.6) |

---

### Release Notes

<details>
<summary>angular/angular</summary>

### [`v15.2.6`](https://github.com/angular/angular/blob/HEAD/CHANGELOG.md#&#8203;1526-2023-04-05)

[Compare Source](angular/angular@15.2.5...15.2.6)

##### core

| Commit | Type | Description |
| -- | -- | -- |
| [d9efa1b0d7](angular/angular@d9efa1b) | feat | change the URL sanitization to only block javascript: URLs ([#&#8203;49659](angular/angular#49659)) |

##### router

| Commit | Type | Description |
| -- | -- | -- |
| [cad7274ef9](angular/angular@cad7274) | fix | create correct URL relative to path with empty child ([#&#8203;49691](angular/angular#49691)) |
| [9b61379096](angular/angular@9b61379) | fix | Ensure initial navigation clears current navigation when blocking ([#&#8203;49572](angular/angular#49572)) |

#### Special Thanks

Andrew Scott, Guillaume Weghsteen, John Manners, Johnny Gérard, Matthieu Riegler, Robin Richtsfeld, Sandra Limacher, Sarthak Thakkar, Vinit Neogi and vikram menon

<!-- CHANGELOG SPLIT MARKER -->

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4zNC4wIiwidXBkYXRlZEluVmVyIjoiMzUuMzguMCJ9-->

Co-authored-by: cabr2-bot <cabr2.help@gmail.com>
Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1851
Reviewed-by: Epsilon_02 <epsilon_02@noreply.codeberg.org>
Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
@angular-automatic-lock-bot
Copy link

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

@angular-automatic-lock-bot angular-automatic-lock-bot bot locked and limited conversation to collaborators May 5, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
action: merge The PR is ready for merge by the caretaker area: security Issues related to built-in security features, such as HTML sanitation detected: feature PR contains a feature commit hotlist: google security Issues that generally impact framework or application security target: patch This PR is targeted for the next patch release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants