flawopen.com/Teardowns/cve-2026-10032-a2ui-agent-button-xss
CVE-2026-10032: A2UI के एजेंट-निर्मित बटन में XSS
प्रभावित संस्करणों में डिफ़ॉल्ट Basic Catalog की openUrl कार्रवाई एजेंट का URL बिना scheme सीमा के window.open को भेजती थी। सलाह में बताए ब्राउज़र-origin प्रभाव के लिए व्यक्ति को रेंडर किए Button पर क्लिक करना पड़ता था; 0.10.2 या बाद में अपग्रेड करें।[1]
ऐसे कियोस्क की कल्पना करें जिसमें सहायक बटन रखता है और गंतव्य अपने दिए कार्ड पर लिखता है। कियोस्क देखता है कि कार्ड पर पता है, यह नहीं कि वह सामान्य वेब पेज तक जाता है। आगंतुक को बटन दबाना होगा; गंतव्य नियम न हो तो ब्राउज़र पते को कियोस्क का निर्देश समझ सकता है। सुधार पते को पार्स करके केवल HTTP या HTTPS स्वीकारता है।[1], [2]
इस पेज के मुख्य शब्द
A2UI- एजेंट-निर्मित UI का ओपन-सोर्स प्रोटोकॉल और प्रोजेक्ट; सलाह web_core के Basic Catalog पर है।[1]
Basic Catalog- रेंडर UI actions के लिए A2UI के अंतर्निहित फ़ंक्शनों का समूह; डिफ़ॉल्ट रूप से सक्षम।[1]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-79
मूल कारण विश्लेषण (Root Cause)
प्रभावित Basic Catalog URL तर्क को नीति-जाँच वाले अविश्वसनीय नेविगेशन इनपुट के बजाय खोलने वाली string मानता था। API ने string प्रकार जाँचा, पर कमजोर कोड window.open(args.url, '_blank') से पहले प्रोटोकॉल सीमित नहीं करता था। एजेंट-नियंत्रित Button.functionCall मान को sink तक पहुँचा सकता था। क्लिक आवश्यक था; A2UI सलाह पीड़ित ऐप के browser-origin में script execution बताती है। सुधार URL parse करता, केवल http: और https: स्वीकारता और noopener,noreferrer के साथ सामान्यीकृत URL खोलता है। यह इसी navigation sink को ठीक करता है, हर एजेंट UI की सुरक्षा की गारंटी नहीं।[1], [2]
CVE-2026-10032: प्रभावित संस्करण और कार्रवाई सीमा
| तैनाती की स्थिति | सलाह से स्थापित तथ्य | रक्षा की कार्रवाई |
|---|---|---|
| डिफ़ॉल्ट Basic Catalog के साथ @a2ui/web_core 0.9.0, 0.9.1, 0.9.2, 0.10.0 या 0.10.1। | A2UI सलाह इन्हें प्रभावित बताती है और Basic Catalog डिफ़ॉल्ट रूप से सक्षम है। | 0.10.2 या बाद में अपग्रेड करें और deployed app का संस्करण जाँचें। |
| Button function call एजेंट-नियंत्रित डेटा से आती है और व्यक्ति क्लिक करता है। | सलाह क्लिक से openUrl और browser-origin प्रभाव बताती है; यह zero-click नहीं। | कार्रवाई तर्क अविश्वसनीय मानें और URL खोलने वाले function में जाँचें। |
| ऐप A2UI का React, Lit या Angular renderer उपयोग करता है। | सलाह इन एकीकरणों को शामिल करती है; कमजोर सीमा web_core का साझा Basic Catalog action है। | पैकेज जाँचें और web_core अपडेट करें; renderer setting कार्रवाई हटाती है, यह न मानें। |
| ऐप @a2ui/web_core 0.10.2 या बाद का चलाता है। | रखरखावकर्ता 0.10.2 को सुधरा संस्करण बताते हैं; patch URL parse, HTTP/HTTPS allowlist और noopener,noreferrer जोड़ता है। | मान्य/अमान्य schemes के regression tests और custom openUrl समीक्षा बनाए रखें। |
हमले का चरण-दर-चरण प्रवाह
एजेंट Button कार्रवाई देता है
A2UI डेटा function call और तर्क वाला Button बना सकता है। एजेंट से आई कार्रवाई को अविश्वसनीय मानें।[1]
Basic Catalog openUrl हल करता है
डिफ़ॉल्ट Basic Catalog openUrl देता है; schema string माँगता है, पर कमजोर कोड URL scheme सीमित नहीं करता था।[1]
कार्रवाई window.open तक पहुँचती है
patch से पहले openUrl प्रोटोकॉल जाँचे बिना string को window.open भेजता था। सलाह पीड़ित ऐप के browser-origin में script execution बताती है।[1]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
कमज़ोर अंश A2UI सलाह में बताई implementation से है। PR #1707 पते को parse/resolve करता है, केवल HTTP/HTTPS स्वीकारता है, और खुले पृष्ठ को मूल पृष्ठ नियंत्रित करने या referrer पाने से रोकता है। project types/imports छोड़े हैं; यह पूरा फ़ाइल या PoC नहीं।[1], [2]
सोर्स अंश: basic_functions.ts — OpenUrlImplementation
export const OpenUrlImplementation = createFunctionImplementation(OpenUrlApi, args => {
if (args.url && typeof window !== 'undefined' && window.open) {
window.open(args.url, '_blank');
}
});
export const OpenUrlImplementation = createFunctionImplementation(OpenUrlApi, args => {
if (args.url && typeof window !== 'undefined' && window.open) {
const baseHref =
typeof window.location !== 'undefined' && window.location.href
? window.location.href
: undefined;
let url: URL;
try {
url = baseHref ? new URL(args.url, baseHref) : new URL(args.url);
} catch (e: any) {
throw new A2uiExpressionError(`Invalid URL specified: ${args.url}`, 'openUrl', e);
}
// प्रोटोकॉल की सख्त अनुमति-सूची: केवल HTTP और HTTPS की अनुमति है।
if (url.protocol !== 'https:' && url.protocol !== 'http:') {
throw new A2uiExpressionError(`Unsupported URL scheme: ${url.protocol}`, 'openUrl');
}
// खुले हुए पेज को मूल विंडो नियंत्रित करने से रोकने के लिए हमेशा noopener और noreferrer का उपयोग करें।
window.open(url.href, '_blank', 'noopener,noreferrer');
}
});
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓सभी प्रत्यक्ष और पारगमन @a2ui/web_core निर्भरताएँ 0.10.2 या बाद में अपग्रेड करें; lockfile और production bundle का संस्करण जाँचें।[1]
- ✓Basic Catalog तथा React, Lit या Angular renderer वाले ऐप सूचीबद्ध करें; जाँचें कि एजेंट UI डेटा Button calls तय कर सकता है।[1]
- ✓navigation sink पर URL जाँचें: पहले parse और resolve करें, फिर केवल मंज़ूर HTTP/HTTPS scheme स्वीकारें; prefix जाँच पर निर्भर न रहें।[2]
- ✓बाहरी पते
noopener,noreferrerसे खोलें और उपयोगकर्ता-सहमति नीति अलग लागू करें; ये अलग जोखिम संभालते हैं।[2] - ✓unit tests से HTTP/HTTPS और relative URL resolution तथा malformed और गैर-HTTP(S) schemes का
window.openसे पहले rejection जाँचें।[2] - ✓एजेंट के label, गंतव्य और function तर्क अविश्वसनीय हैं; हर action sink पर validation जाँचें, renderer पर निर्भर न रहें।[1], [2]