False positive - Log injection is not mitigated via replace with Regex argument in Kotlin
- Dominant language
- CodeQL
- Stars
- 10.1k
- Forks
- 2.1k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 141
Description
**Description of the false positive**
CodeQL is reporting a log injection vulnerability even though I am deleting the problematic characters with Kotlin's `replace` function call with a Regex as its first parameter.
Reading the query (https://github.com/github/codeql/blob/main/java/ql/lib/semmle/code/java/security/LogInjection.qll) I suspect that's because it searches for uses of `replace` with either Strings or Chars as arguments (in order to check for line break removal), but not uses of `replace` with Regex as its first argument (in Kotlin, there is no `replaceAll` function, there is only a `replace` that can accept either String, Char or Regex).
I have also looked at the tests (https://github.com/github/codeql/blob/main/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.java) and that's why I belive this might be the reason, as the tests always use `replaceAll` when working with regular expressions (as it is a Java file).
**Code samples or links to source code**
```
private fun baseSanitize(param: String) = param.replace(Regex("[^a-zA-Z0-9_-]"), "")
private fun baseSanitize(param: String) = param.replace("[^a-zA-Z0-9_-]".toRegex(), "")
private fun baseSanitize(param: String) = param.replace("\\W".toRegex(), "")
```
Contributor guide
Research direction
Read java/ql/lib/semmle/code/java/security/LogInjection.qll and the regression tests in java/ql/test/query-tests/security/CWE-117/LogInjectionTest.java, focusing on how replace and replaceAll calls are handled. Add coverage for the Kotlin Regex replace examples so the query no longer reports them as log injection, then run the LogInjectionTest.java query tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- kotlin
- Domain
- security
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100