Root cause
Injection & unsafe execution introduced
The website link places a text-escaped value inside a quoted HTML attribute.
How AI contributed: Direct introductionPublished May 8, 2026 in
modelcontextprotocol/registryAll 3 findings in this repository
Provisional finding. Full causal and release verification remains incomplete.
Root cause
The website link places a text-escaped value inside a quoted HTML attribute.
Fix
The new attribute escaper encodes characters that can terminate quoted attributes.
Case facts
@@ -0,0 +426,18 @@+ <a href="${escapeHtml(server.repository.url)}" target="_blank" class="text-blue-600 hover:underline break-all" onclick="event.stopPropagation()">${escapeHtml(server.repository.url)}</a>+ </div>+ ` : ''}+ ${server.websiteUrl ? `+ <div>+ <span class="font-medium">Website:</span>+ <a href="${escapeHtml(server.websiteUrl)}" target="_blank" class="text-blue-600 hover:underline break-all" onclick="event.stopPropagation()">${escapeHtml(server.websiteUrl)}</a>+ </div>+ ` : ''}+ <div>+ <a href="${baseUrl}/v0.1/servers/${encodeURIComponent(server.name)}/versions/${encodeURIComponent(server.version)}" target="_blank" class="text-blue-600 hover:underline break-all" onclick="event.stopPropagation()">View in API</a>+ </div>+ ${packagesHtml}+ ${remotesHtml}+ <details class="mt-4" onclick="event.stopPropagation()">+ <summary class="cursor-pointer text-blue-600 hover:underline">View full server.json</summary>+ <pre class="mt-2 p-3 bg-gray-100 rounded text-xs overflow-x-auto break-all">${escapeHtml(JSON.stringify(item, null, 2))}</pre>+ </details>@@ -495,7 +498,18 @@ const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } + // Safe for HTML attribute values per OWASP attribute-encoding rule.+ function escapeAttr(text) {+ if (text == null) return '';+ return String(text)+ .replace(/&/g, '&')+ .replace(/</g, '<')+ .replace(/>/g, '>')+ .replace(/"/g, '"')+ .replace(/'/g, ''');+ }+ function formatDate(dateStr) { if (!dateStr) return '-';AI-assisted change 7be80df171c58ddaa2400433bb6dbc4a10e407ce172217556ad8f1a1698fe674 · Fix edddc0d39f42cfe0d7697465364a7b8d7dccbd2a5ac224ac58bf0d202eec45a4