function attackSurfaceFigure(host) { ensureStyles(); var threats = [ 'poisoned description', 'rug pull', 'tool shadowing', 'token passthrough', 'requestState tamper', 'network $ref (SSRF)', 'DNS rebinding', 'supply chain drift' ]; var cx = 280; var cy = 150; var r = 108; var boxW = 122; var boxH = 24; var n = threats.length; var spokes = []; var nodes = []; var labels = []; var i; for (i = 0; i < n; i++) { var angle = (Math.PI * 2 * i) / n - Math.PI / 2; var x = cx + r * Math.cos(angle); var y = cy + r * Math.sin(angle); var bx = x - boxW / 2; var by = y - boxH / 2; spokes.push(''); nodes.push(''); labels.push('' + threats[i] + ''); } var shell = document.createElement('div'); shell.className = 'mf-shell'; shell.innerHTML = [ '
Attack Surface Around a Tool Call eight threats a gateway still faces after consent and OAuth are both correct
', '
', '', '', spokes.join(''), '', 'gateway', 'pin . scan . limit', nodes.join(''), labels.join(''), '', '
', '
Each spoke names one threat this lesson covers. The gateway at the center holds the controls that answer them: definition pinning and quarantine for rug pulls, an injection scanner for poisoned descriptions, server-qualified names against shadowing, audience validation against passthrough, integrity-protected state, a refusal to auto-dereference network references, and admission pinning against supply chain drift, so no single control has to catch everything alone.
' ].join(''); host.appendChild(shell); } // register as: mcpa-26-attack-surface