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
',
'
',
'',
'
',
'
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.