NocoDB is software for building databases as spreadsheets. Prior to version 0.301.3, an authenticated user with Editor role can inject arbitrary HTML into Rich Text cells by bypassing the TipTap editor and sending raw HTML via the API. This issue has been patched in version 0.301.3.
NocoDB versions prior to 0.301.3 contain a stored cross-site scripting (XSS) vulnerability in Rich Text cells that allows authenticated Editor-role users to inject arbitrary HTML through API bypass. While requiring authentication and editor privileges, this vulnerability can lead to data exfiltration, session hijacking, and lateral movement within collaborative database environments. The lack of available patches and no public exploits present a moderate but manageable risk requiring immediate mitigation strategies.
Immediate Actions:
1. Identify all NocoDB instances in your environment and document their versions
2. Restrict API access to Rich Text endpoints using network-level controls and WAF rules
3. Audit all Editor-role user accounts for suspicious activity and recent API calls
4. Review audit logs for unauthorized HTML injection attempts in Rich Text cells
Patching Guidance:
1. Upgrade to NocoDB version 0.301.3 or later immediately when available
2. If upgrade is not immediately possible, implement compensating controls
Compensating Controls (if patch unavailable):
1. Implement strict input validation at the API level to reject HTML tags in Rich Text submissions
2. Deploy WAF rules to detect and block API requests containing HTML/script tags to Rich Text endpoints
3. Restrict Editor role assignments to trusted users only; conduct access reviews
4. Implement Content Security Policy (CSP) headers with strict-dynamic and script-src 'self' only
5. Enable HTML sanitization on all Rich Text cell outputs using DOMPurify or similar libraries
6. Implement database-level triggers to log all Rich Text cell modifications
Detection Rules:
1. Monitor API logs for POST/PUT requests to Rich Text endpoints containing HTML tags (<, >, script, iframe, etc.)
2. Alert on Rich Text cells containing script tags, event handlers (onclick, onload), or iframe elements
3. Track Editor role users making API calls outside normal business hours
4. Monitor for unusual patterns in Rich Text cell modifications by single users
5. Implement SIEM rules: (source=nocodb_api) AND (endpoint=*richtext*) AND (payload contains "<script" OR "<iframe" OR "javascript:")
الإجراءات الفورية:
1. حدد جميع مثيلات NocoDB في بيئتك وقم بتوثيق إصداراتها
2. قيد الوصول إلى واجهة برمجة التطبيقات لنقاط نهاية النصوص الغنية باستخدام عناصر التحكم على مستوى الشبكة وقواعد WAF
3. قم بمراجعة جميع حسابات المستخدمين بدور المحرر للنشاط المريب واستدعاءات واجهة برمجة التطبيقات الأخيرة
4. راجع سجلات التدقيق لمحاولات حقن HTML غير المصرح بها في خلايا النصوص الغنية
إرشادات التصحيح:
1. قم بالترقية إلى إصدار NocoDB 0.301.3 أو أحدث فوراً عند توفره
2. إذا لم يكن الترقية ممكنة على الفور، قم بتنفيذ عناصر تحكم تعويضية
عناصر التحكم التعويضية (إذا لم يكن التصحيح متاحاً):
1. تنفيذ التحقق الصارم من المدخلات على مستوى واجهة برمجة التطبيقات لرفض علامات HTML في تقديمات النصوص الغنية
2. نشر قواعد WAF للكشف عن طلبات واجهة برمجة التطبيقات التي تحتوي على علامات HTML/script وحظرها لنقاط نهاية النصوص الغنية
3. تقييد تعيينات دور المحرر للمستخدمين الموثوقين فقط؛ إجراء مراجعات الوصول
4. تنفيذ رؤوس سياسة أمان المحتوى (CSP) مع strict-dynamic و script-src 'self' فقط
5. تنفيذ تنظيف HTML على جميع مخرجات خلايا النصوص الغنية باستخدام DOMPurify أو مكتبات مماثلة
6. تنفيذ محفزات على مستوى قاعدة البيانات لتسجيل جميع تعديلات خلايا النصوص الغنية
قواعد الكشف:
1. مراقبة سجلات واجهة برمجة التطبيقات لطلبات POST/PUT لنقاط نهاية النصوص الغنية التي تحتوي على علامات HTML
2. التنبيه على خلايا النصوص الغنية التي تحتوي على علامات script أو معالجات الأحداث أو عناصر iframe
3. تتبع مستخدمي دور المحرر الذين يقومون باستدعاءات واجهة برمجة التطبيقات خارج ساعات العمل العادية
4. مراقبة الأنماط غير العادية في تعديلات خلايا النصوص الغنية من قبل مستخدمين واحدين
5. تنفيذ قواعد SIEM: (source=nocodb_api) AND (endpoint=*richtext*) AND (payload contains "<script" OR "<iframe" OR "javascript:")