JavaScript DOM XSS via fetch().json() → insertAdjacentHTML not detected by CodeQL
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- javascript
- 領域
- security
調査の方向性
JavaScript の security-extended クエリスイートから始め、fetch().json() のレスポンスと insertAdjacentHTML がどのようにモデル化されているかを確認します。このフローが意図的に除外されているのか、それともソースとシンクのモデル化が必要なのかを判断し、その結論を提供された例に照らして検証したうえで、XSS の結果が想定されるかどうかを確認します。
索引モデルが issue の本文から書いたものです。
説明
Description of the false positive
We are trying to better understand the design decisions behind JavaScript XSS detection in CodeQL, specifically around taint sources involving network responses.
I have a piece of client-side JavaScript that builds HTML using insertAdjacentHTML with values coming from a fetch().json() response. From an application-security perspective, this is treated as a potential DOM XSS risk in our project, but CodeQL does not report it.
I’d like to confirm whether this behavior is by design, and if so, what the recommended way is to model this trust boundary.
Code samples or links to source code
function loadMessageLogs(pageSize, continuationToken) {
let url = '?handler=LoadMessageLogs&pageSize=' + pageSize;
if (continuationToken)
url += '&continuationToken=' + encodeURIComponent(continuationToken);
fetch(url)
.then(response => response.json())
.then(data => {
const tbody = document.querySelector("#tblMessageLogs tbody");
tbody.innerHTML = "";
if (!data.items || data.items.length === 0) {
messageLogs.hidden = true;
noMessageLogs.hidden = false;
}
else {
data.items.forEach(item => {
const link = `<a href="/MessageLogs/Details/${item.messageId}">View message</a>`;
const row = `<tr>
<td>${item.createdDate}</td>
<td>${item.messageId}</td>
<td>${item.interfaceId ?? ''}</td>
<td>${item.target ?? ''}</td>
<td>${item.mpanCore ?? ''}</td>
<td>${item.meterId ?? ''}</td>
<td>${link}</td>
</tr>`;
tbody.insertAdjacentHTML('beforeend', row);
});
PagingModule.updatePaging(data.continuationToken)
messageLogs.hidden = false;
noMessageLogs.hidden = true;
}
});
}
In our case, data.items[*] ultimately contains data that may originate from user input stored and returned by the backend.
- We are running the javascript-security-extended query suite.
- No XSS issue is reported for this code.
- 主要言語
- CodeQL
- スター
- 10.1k
- フォーク
- 2.1k
- 平均マージ
- 2日 16時間
- マージ済み PR(30日)
- 143
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
github/codeql のほかの issue
-
agentic-workflows
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
false-positive javascript
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
-
C#: cs/simplifiable-boolean-expression false positive on Nullable<bool> compared with a literal オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
false-positive
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
似ている issue
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
canonical/paas-charm#368 · コメント 1 件 ·
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
palladius/rails8-app-on-gcp#142 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
StevenBlack/hosts#3256 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
corsairdev/corsair#1764 ·
-
oblt-aw/detector/security
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100