JS: False negative - unsafe postMessage handler not detected #15571
+9
−29
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.


Description of the issue
I tested CodeQL on JS, which handles postMessage validation. The rule for detecting the absence of an origin check in the postMessage handler function does not cover all possible ways to bypass that check.
Firstly, the rule doesn't identify cases where only
event.sourceis checked. Such verification can be easily bypassed.https://book.hacktricks.xyz/pentesting-web/postmessage-vulnerabilities#bypassing-e.source
Secondly, checks like
"safeOrigin".startsWith(event.origin)and"safeOrigin".endsWith(event.origin)can also be bypassed.Lastly, there are methods to bypass the equality operation as well, so it's only safe to use strict equality operators (
===and!==).For more details on bypassing origin checks, you can refer to: https://book.hacktricks.xyz/pentesting-web/postmessage-vulnerabilities#origin-check-bypasses, https://book.hacktricks.xyz/pentesting-web/postmessage-vulnerabilities#e.origin-window.origin-bypass
The only secure way to handle postMessage is to always check
event.origin.CodeQL Rule
Rule: MissingOriginCheck.ql
Thank you for your time!