الأمان في Wixzel Voice
يشفّر Wixzel Voice كلمات مرور مزوّدي الاتصالات في حالة التخزين، ولا يخزّن مفاتيح API إلا كقيم تجزئة مُضاف إليها pepper، ويوقّع كل webhook، ويُبقي API وبياناته في مومباي بالهند. تذكر هذه الصفحة ما يفرضه الكود اليوم، وما لم يُطبَّق بعد، وكيف تبلّغ عن ثغرة.
آخر تحديث
نُشر في
Wixzel Voice هو API للذكاء الاصطناعي الصوتي لبناء وكلاء ذكاء اصطناعي يجرون مكالمات هاتفية حقيقية ويردّون عليها عبر SIP trunk الخاص بك، أو يتحدثون إلى الناس في تطبيقات الويب والجوال الخاصة بك. مفتاح API واحد ورصيد مدفوع مسبقًا واحد يغطيان كل محركات الصوت، مع فوترة بالثانية حسب الاستخدام الفعلي. وهذا يعني أنه يحتفظ بثلاثة أشياء تستحق الحماية: بيانات اعتماد مزوّد الاتصالات الخاصة بك، والمفاتيح التي تنفق رصيدك، والصوت والنصوص المكتوبة وجهات الاتصال للمكالمات التي يجريها وكلاؤك.
ما الذي يشفّره Wixzel Voice ويجزّئه ويوقّعه؟
| المعلومة | القيمة | المصدر |
|---|---|---|
| كلمات مرور مزوّد الاتصالات (SIP trunk) | القيم الجديدة والمحدّثة مشفّرة في حالة التخزين بـ AES-256-GCM بمفتاح خاص بكل نشر؛ والقيم الأقدم يُعاد تشفيرها عند حفظها التالي؛ ولا يعيدها API مرة أخرى أبدًا | API: تشفير بيانات الاعتماد |
| مفاتيح API | تُعرض مرة واحدة؛ وتُخزَّن فقط كـ HMAC-SHA256 مع pepper على الخادم؛ ومحددة الصلاحيات، دون صلاحية مسؤول | API: المفاتيح |
| تسجيل الدخول لموصّل MCP | تدفق رمز التفويض في OAuth 2.1، مع PKCE بطريقة S256 فقط؛ والرمز المميز مفتاح API محدد الصلاحيات وقابل للإلغاء | الوثائق: خادم MCP |
| الـ webhooks | موقّعة: X-Wixzel-Signature هي HMAC-SHA256 للمحتوى الخام؛ وتُرفض العناوين التي تشير إلى شبكات خاصة | الوثائق: Webhooks |
| المسارات المالية | Idempotency-Key مطلوب في POST /v1/calls وPOST /v1/agents/{id}/test-call وPOST /v1/billing/topups؛ ويُحتفظ به 24 ساعة | API: عدم التكرار (idempotency) |
| حدود المعدل | 10 طلبات في الثانية لكل مفتاح، مع دفعة قصوى قدرها 20؛ وتسجيل الدخول وإنشاء الحساب محدودان لكل عنوان IP ولكل بريد إلكتروني | الوثائق: حدود المعدل |
| النقل | TLS على اتصالات HTTPS وWebSocket إلى API ولوحة التحكم وخادم MCP، مع HSTS لمدة سنة تشمل النطاقات الفرعية. يستخدم SIP إلى مزوّد الاتصالات بروتوكول النقل المضبوط على الـ trunk (UDP افتراضيًا، وTLS إذا ضُبط)، وصوت المكالمة (RTP) غير مشفّر | API: تقوية HTTP، وإعدادات SIP |
| كلمات مرور الحسابات | bcrypt، بمعامل تكلفة 12 | API: الحسابات |
| مكان البيانات | Hostinger، مومباي، الهند؛ ولوحة التحكم والموقع على Vercel | سياسة الخصوصية |
| أرقام البطاقات | لا تصل إلى Wixzel Voice أبدًا؛ Dodo Payments هي التاجر المسجّل | الحقائق |
| الإبلاغ عن ثغرة | aqeel@wixzel.com، كما هو مذكور في /.well-known/security.txt | security.txt |
كيف يحمي Wixzel Voice كلمات مرور مزوّدي الاتصالات؟
يحتاج Wixzel Voice إلى كلمة مرور SIP trunk الخاصة بك لإجراء المكالمات عبر مزوّد الاتصالات، لذا لا يمكنه تجزئتها، بل يشفّرها. كلمات مرور الـ trunk الجديدة والمحدّثة، وكل بيانات اعتماد أخرى لطرف ثالث تحتفظ بها المنصة نيابةً عن العميل، مشفّرة في حالة التخزين بـ AES-256-GCM. يُشتق المفتاح الرئيسي باستخدام scrypt من سرّ لا يوجد إلا في بيئة النشر، وتحصل كل قيمة على مفتاح رسالة خاص بها عبر HKDF، ويُختم كل نص مشفّر بمعرّف المفتاح الذي كتبه، حتى يتمكن تدوير المفاتيح مستقبلًا من إعادة تغليف القيم بدل فقدانها. القيم المكتوبة بالنظام الأقدم ما زالت قابلة للقراءة، ويُعاد تشفيرها بهذه الطريقة عند حفظها التالي.
وضع GCM موثَّق: النص المشفّر الذي يُعدَّل في قاعدة البيانات يفشل فك تشفيره بدل أن يتحول إلى كلمة مرور مختلفة. وبيانات الاعتماد التي يتعذر فك تشفيرها تُرفض برسالة صريحة بدل معاملتها كقيمة فارغة، فلا يمكن أن يصبح الـ trunk غير موثَّق بصمت. ولا يعيد API كلمة مرور الـ trunk مرة أخرى أبدًا، حتى إليك.
إعدادات الاتصالات المولّدة من إعدادات الـ trunk الخاصة بك محصّنة ضد الحقن، والمولّد مختبَر باختبار fuzzing للتحقق من هذه الخاصية.
كيف يخزّن Wixzel Voice مفاتيح API ويحدد صلاحياتها؟
يُعرض مفتاح wv_live_ مرة واحدة. يخزّن Wixzel Voice قيمة HMAC-SHA256 له بمفتاح pepper على الخادم، فلا يمكن استخدام نسخة من قاعدة البيانات وحدها لاستعادة مفتاح أو كسره بالتجربة. ويُحتفظ بالبادئة وآخر أربعة أحرف فقط لتتمكن من التعرف على المفتاح في القائمة.
- الصلاحيات. يحمل كل مفتاح الصلاحيات التي تمنحها فقط، مثل
calls:readأوsip_trunks:write. لا توجد صلاحية مسؤول، فلا يستطيع أي مفتاح فعل كل شيء. - حدود الإنفاق. يمكن أن يحمل المفتاح
spend_limit_micros؛ وبمجرد أن ينفق المفتاح حده، تُرفض المكالمات التي تُجرى به قبل الاتصال. - انتهاء الصلاحية والتدوير. يمكن أن يحمل المفتاح
expires_at. ويُصدرPOST /v1/api-keys/{id}/rotateمفتاحًا بديلًا ويُبقي المفتاح القديم عاملًا لمدة 24 ساعة، فلا تمر عملية النشر بلحظة بلا مفتاح صالح. - الإلغاء. إلغاء المفتاح يحذفه من ذاكرة المصادقة المؤقتة فورًا، فيتوقف عن العمل من الطلب التالي.
- العزل. كل مورد ينتمي إلى حساب واحد، وكل استعلام محصور في الحساب الذي طلبه.
كيف يسجّل موصّل MCP من Wixzel Voice الدخول؟
تتصل عملاء الذكاء الاصطناعي مثل claude.ai وClaude Desktop وClaude Code بخادم MCP من Wixzel Voice عبر خادم تفويض OAuth 2.1 مدمج في API. تسجّل العملاء نفسها (RFC 7591)، وترسلك إلى لوحة التحكم لتمنح موافقتك، ثم تستبدل الرمز برمز مميز. PKCE مطلوب، بطريقة S256 فقط؛ وتُرفض طريقة plain.
الرمز المميز الذي يتلقاه العميل مفتاح API عادي محدد الصلاحيات، لا يحمل إلا الصلاحيات التي وافقت عليها، وإلغاء التفويض يلغي المفتاح. ولا تقبل نقاط نهاية OAuth مفتاح API كبيانات اعتماد أبدًا: يُثبت العميل هويته عبر PKCE، وعبر سرّ العميل إن كان قد سجّل واحدًا.
كيف يوقّع Wixzel Voice الـ webhooks؟
كل طلب POST لـ webhook يحمل X-Wixzel-Signature، وهي قيمة HMAC-SHA256 للمحتوى الخام بمفتاح سرّ الـ webhook الخاص بك. تحقق منها على البايتات الخام قبل التحليل، وقارن في زمن ثابت. يُعاد السرّ مرة واحدة، عند تدويره، ولا يعيده GET /v1/webhook أبدًا، فلا يمكن تحويل مفتاح مسرّب بصلاحية قراءة إلى أحداث مزوّرة.
عنوان webhook الذي يشير إلى loopback أو link-local أو نطاق عناوين خاص يُرفض بـ 400 unsafe_webhook_url عند ضبطه ومرة أخرى وقت التسليم، ولا تُتبع عمليات إعادة التوجيه. تستطيع المنصة الوصول إلى عناوين لا تستطيع أنت الوصول إليها، لذا لن تُوجَّه إليها.
ما الذي يمنع إعادة المحاولة من الاحتساب مرتين في Wixzel Voice؟
تتطلب POST /v1/calls وPOST /v1/agents/{id}/test-call وPOST /v1/billing/topups ترويسة Idempotency-Key. إعادة الطلب بالمفتاح نفسه والمحتوى نفسه تعيد الاستجابة الأصلية بدل الاتصال أو الاحتساب مرة أخرى؛ والمفتاح نفسه بمحتوى مختلف يُرفض بـ 422. يُحتفظ بالمفاتيح لمدة 24 ساعة. وكلتا حزمتي SDK الرسميتين ترسلان واحدًا تلقائيًا على هذه المسارات.
يُحجز الرصيد قبل إجراء المكالمة، والمكالمة التي لا يكفي الرصيد لأول 15 ثانية منها تُرفض بـ 402 قبل حجز أي شيء، وتُثبَّت الأسعار لكل مكالمة عند قبولها. أرقام البطاقات لا تصل إلى Wixzel Voice أبدًا: تمر المدفوعات عبر Dodo Payments بصفتها التاجر المسجّل.
ما الذي يحمي Wixzel Voice من إساءة الاستخدام؟
- حدود معدل API: 10 طلبات في الثانية لكل مفتاح، مع دفعة قصوى قدرها 20. الاستجابة
429تحملRetry-Afterولا تُحتسب أبدًا. - تسجيل الدخول وإنشاء الحساب محدودان لكل عنوان IP ولكل عنوان بريد إلكتروني؛ وكلمات المرور مُجزّأة بـ bcrypt بمعامل تكلفة 12، ويُؤكَّد إنشاء الحساب بالبريد الإلكتروني برمز يُرسل إلى ذلك العنوان.
- جلسات لوحة التحكم تُحفظ في ملف تعريف ارتباط httpOnly، ولا تظهر في عنوان URL أبدًا؛ وخوارزمية توقيع رمز الجلسة مثبّتة؛ ويمكنك تسجيل الخروج من كل الجلسات دفعة واحدة.
- ماسحات SIP التي تتحسس الأرقام تُحظر مؤقتًا، وكل محاولة مكالمة واردة محدودة المعدل لكل عنوان مصدر قبل حجز أي رصيد، فلا تُحتسب الحركة المرفوضة على أحد أبدًا.
- المكالمات المتزامنة محدودة لكل حساب، 5 افتراضيًا، فلا يستطيع حساب واحد أن يشغل كل الخطوط على المنصة.
- تقوية HTTP: إعادة توجيه إلى TLS، وHSTS لمدة سنة تشمل النطاقات الفرعية، وترويسات أمان، وحدود معلنة لحجم محتوى الطلب.
- SIP إلى مزوّد الاتصالات يستخدم بروتوكول النقل المضبوط على الـ trunk: UDP افتراضيًا، أو TCP أو TLS إذا ضبطت
transport. صوت المكالمة (RTP) غير مشفّر.
أين يخزّن Wixzel Voice البيانات، ومن يعالجها؟
يعمل API الخاص بـ Wixzel Voice وقواعد بياناته ووسائط المكالمات على Hostinger في مومباي، الهند. وتقدّم Vercel لوحة التحكم وهذا الموقع. أثناء المكالمة، يعالج مزوّدو الكلام واللغة لمحرك الوكيل (Deepgram أو ElevenLabs أو OpenRouter أو Google أو Sarvam) الصوت والنص؛ وهم في الولايات المتحدة، باستثناء Sarvam التي تعالج الكلام في الهند.
تُحفظ النصوص المكتوبة، والتسجيلات إن كانت المكالمة مسجّلة، مع سجل المكالمة حتى تحذفها؛ ويحذف DELETE /v1/calls/{id} السجل والنص المكتوب والتسجيل معًا، وإغلاق الحساب من لوحة التحكم يحذف كل ما فيه دفعة واحدة. تُحذف سجلات الطلبات بعد ثلاثة أشهر. القائمة الكاملة للمعالجين الفرعيين، مع دور كل منهم وموقعه، موجودة في سياسة الخصوصية، وملحق معالجة البيانات يسري على كل عميل، مع إشعار بالاختراق خلال 72 ساعة.
كيف تُنسخ بيانات Wixzel Voice احتياطيًا؟
تُفرَّغ قاعدتا بيانات الإنتاج كل ساعة. وفي تمرين أسبوعي يُستعاد أحدث تفريغ إلى قاعدة بيانات تجريبية، ويُتحقق من أن رصيد كل حساب يساوي مجموع قيود سجله المالي، فيُعرف أن النسخة الاحتياطية قابلة للاستخدام لا موجودة فحسب.
حدّ واحد بصراحة: النسخ الاحتياطية محفوظة على الخادم نفسه، دون نسخة في مكان آخر. فهي تغطي نشرًا سيئًا، وقاعدة بيانات تالفة، وبيانات حُذفت بالخطأ؛ لكنها لا تغطي فقدان الخادم نفسه.
ما الذي لم يُطبَّق بعد في Wixzel Voice؟
- يشغّل Wixzel Voice شخص واحد؛ والوصول إلى بيئة الإنتاج مقصور على هذا المشغّل.
- لا يوجد تقرير SOC 2 ولا شهادة ISO 27001.
- وسائط المكالمات إلى مزوّدي الاتصالات غير مشفّرة: صوت المكالمة (RTP) ينتقل دون SRTP، وإشارات SIP تستخدم بروتوكول النقل المضبوط على الـ trunk، وهو UDP ما لم تضبط TLS.
- لا يوجد نسخ احتياطي خارج الموقع: النسخ الاحتياطية محفوظة على الخادم نفسه الذي يحمل البيانات.
- تقييد مفتاح API بعناوين IP مصدر معينة غير متاح بعد عبر API ولا لوحة التحكم.
كيف أبلّغ عن ثغرة في Wixzel Voice؟
راسل aqeel@wixzel.com. والعنوان منشور أيضًا في /.well-known/security.txt. اذكر ما وجدته، وخطوات إعادة إنتاجه، وrequest_id من أي استجابة معنية. يقرأ المشغّل الرسائل، ويُرد على معظمها خلال يوم عمل.
يُرجى الاختبار على حسابك وبياناتك فقط، وعدم إضعاف الخدمة للعملاء الآخرين، ومنح وقت معقول لإصلاح المشكلة قبل نشرها.
الأسئلة الشائعة
كيف يخزّن Wixzel Voice كلمة مرور SIP trunk الخاصة بي؟
هل يستطيع Wixzel Voice رؤية مفتاح API الخاص بي؟
wv_live_ وآخر أربعة أحرف لتتمكن من التعرف على المفتاح في القائمة؛ ولا شيء مما يُخزَّن يمكنه إعادة إنتاجه. المفتاح المفقود لا يمكن إلا استبداله.كيف أتحقق من أن webhook صادر من Wixzel Voice؟
X-Wixzel-Signature. يُعرض السرّ مرة واحدة، عند تدويره باستخدام POST /v1/webhook/rotate-secret، ولا يعيده GET /v1/webhook أبدًا.أين تُخزَّن بيانات Wixzel Voice؟
هل لدى Wixzel Voice شهادة أمان؟
كيف أبلّغ عن مشكلة أمنية في Wixzel Voice؟
request_id من أي استجابة معنية. والعنوان نفسه منشور في /.well-known/security.txt.ذو صلة
ابنِ أول وكيل صوتي لك

