String: fix out-of-bounds read in $' substitution expansion - #1116
Open
basavaraj-sm05 wants to merge 1 commit into
Open
String: fix out-of-bounds read in $' substitution expansion#1116basavaraj-sm05 wants to merge 1 commit into
basavaraj-sm05 wants to merge 1 commit into
Conversation
|
🎉 Thank you for your contribution! It appears you have not yet signed the F5 Contributor License Agreement (CLA), which is required for your changes to be incorporated into an F5 Open Source Software (OSS) project. Please kindly read the F5 CLA and reply on a new comment with the following text to agree: I have hereby read the F5 CLA and agree to its terms You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Proposed changes
The
$'token in a replacement string expands to the part of the subject that comes after the match.njs_string_get_substitution()builds it withnjs_string_offset(&s, pos + length), wherelengthis the character length of the matched text.posis already clamped to the subject by every caller, but the matched length is taken as-is, and throughRegExp.prototype[Symbol.replace]with a script-suppliedexec()the match object's[0]can be any string, sopos + lengthcan run well past the end of the subject. On a multibyte subject that pushesnjs_string_offset()intonjs_string_utf8_offset(), whose own comment notes it assumes a valid index and which reads the UTF-8 offset map without a bounds check, so the oversized index reads far outside the map. I noticed it while comparing the$'branch against the neighboring$`branch, which stays in range because it only uses the already-clampedpos. Clampingpos + lengthto the subject length before the offset call closes the read and matches the GetSubstitution step in the spec, where the tail starts atmin(position + matchLength, stringLength).Checklist
Before creating a PR, run through this checklist and mark each as complete:
CONTRIBUTINGdocument