other
- Location
SKILL.md:88- Finding
Attacker-Controlled Fork Resolution Can Misassign Asset Ownership
- Content
View full analysis
{ const audit = await verifySVG(svg); if (!audit.isValid) throw new Error('Cannot transfer invalid SVG'); if (audit.currentOwner !== fromIdentity.did) { throw new Error(`Signer ${fromIdentity.did} is not the current owner (${audit.currentOwner})`); } const manifest = audit.metadata; const timestamp = new Date().toISOString(); const transferPayload = `${manifest.hash}:${toDID}:${timestamp}`; const signature = nacl.sign.detached(decodeUTF8(transferPayload), fromIdentity.secretKey); manifest.transfers.push({ to: toDID, timestamp, signature: toBase64(signature) }); const newManifestBase64 = base64.fromByteArray(decodeUTF8(JSON.stringify(manifest))); return svg.replace(/nasp:(.*?)<\/metadata>/, `nasp:${newManifestBase64}`); } ``` ### Technical Analysis The signature chain proves that a particular sequence of transfers was authorized, but it cannot establish that the sequence is the unique or authoritative history. A current owner can preserve an old valid copy and create multiple independently valid transfers from that state. The documented resolution policy does not safely solve this problem: - Chain length is attacker-controlled because an owner can transfer an asset through identities they control. - Timestamps are generated from the signer's local system clock. - Verification does ...[truncated 1616 chars]- Remediation
View remediation
