本文へスキップ
セキュリティ

Wixzel Voiceのセキュリティ

Wixzel Voiceは、通信事業者のパスワードを保存時に暗号化し、APIキーはペッパー付きのハッシュとしてのみ保存し、すべてのwebhookに署名し、APIとそのデータをインドのムンバイに置いています。このページでは、現在コードで実施していること、まだ導入していないこと、脆弱性の報告方法を説明します。

最終更新日:

公開日:

Wixzel Voiceは、自社のSIPトランク経由で実際の電話を発信・着信するAIエージェントや、Webアプリやモバイルアプリの中で人と話すAIエージェントを構築するための音声AI APIです。1つのAPIキーと1つの前払い残高ですべての音声エンジンを利用でき、実際の使用量に応じて秒単位で課金されます。そのため、保護すべきものが3つあります。通信事業者の認証情報、残高を使うキー、そしてエージェントが行う通話の音声、文字起こし、連絡先です。

Wixzel Voiceは何を暗号化、ハッシュ化、署名していますか?

Wixzel Voiceのセキュリティ対策
項目内容出典
通信事業者(SIPトランク)のパスワード新規・更新された値は、デプロイごとの鍵でAES-256-GCMにより保存時に暗号化。古い値は次に保存したときに再暗号化。APIが再び返すことはないAPI:認証情報の暗号化
APIキー表示は1回のみ。サーバー側のペッパーを使ったHMAC-SHA256としてのみ保存。スコープ付きで、管理者スコープはないAPI:キー
MCPコネクタのログインOAuth 2.1の認可コードフロー、PKCEはS256のみ。トークンはスコープ付きで取り消し可能なAPIキードキュメント:MCPサーバー
webhook署名付き:X-Wixzel-Signatureは生のボディのHMAC-SHA256。プライベートネットワーク宛てのURLは拒否ドキュメント:webhook
費用が発生するパスPOST /v1/calls、POST /v1/agents/{id}/test-call、POST /v1/billing/topupsではIdempotency-Keyが必須。24時間保持API:冪等性
レート制限キーごとに1秒あたり10リクエスト、バースト20。ログインと新規登録はIPごと、メールアドレスごとに制限ドキュメント:レート制限
通信経路API、コンソール、MCPサーバーへのHTTPSとWebSocketの接続はTLSで、サブドメインを含めて1年間のHSTS。通信事業者へのSIPはトランクの転送方式(デフォルトはUDP、設定すればTLS)を使い、通話音声(RTP)は暗号化されないAPI:HTTPの強化、SIPの設定
アカウントのパスワードbcrypt、コスト12API:アカウント
データの保存場所Hostinger(インド、ムンバイ)。コンソールとWebサイトはVercelプライバシーポリシー
カード番号Wixzel Voiceには届かない。Dodo Paymentsが販売者(Merchant of Record)ファクト
脆弱性の報告aqeel@wixzel.com(/.well-known/security.txtに記載)security.txt

Wixzel Voiceは通信事業者のパスワードをどう保護していますか?

Wixzel Voiceは通信事業者経由で電話をかけるためにSIPトランクのパスワードを必要とするため、ハッシュ化はできず、暗号化しています。新規・更新されたトランクのパスワードと、プラットフォームがお客様の代わりに保持するその他すべての第三者の認証情報は、AES-256-GCMで保存時に暗号化されます。マスター鍵はデプロイの環境にだけ存在するシークレットからscryptで導出し、各値にはHKDFで個別のメッセージ鍵を割り当て、各暗号文にはそれを書き込んだ鍵のIDを記録します。そのため、将来の鍵のローテーションでは値を失わずに再ラップできます。古い方式で書き込まれた値も引き続き読み取れ、次に保存したときにこの方式で再暗号化されます。

GCMは認証付きの暗号です。データベース上で改ざんされた暗号文は、別のパスワードになるのではなく、復号に失敗します。復号できない認証情報は空として扱わず、はっきりとエラーにするため、トランクが気づかないうちに認証なしになることはありません。APIはトランクのパスワードを、お客様自身に対しても二度と返しません。

トランクの設定から生成する電話システムの設定はインジェクション対策を施しており、その性質について生成器をファジングでテストしています。

Wixzel VoiceはAPIキーをどう保存し、スコープを設定していますか?

wv_live_キーは1回だけ表示されます。Wixzel Voiceはサーバー側のペッパーを鍵としたHMAC-SHA256を保存するため、データベースのコピーだけではキーを復元することも総当たりで割り出すこともできません。プレフィックスと末尾4文字は、一覧でキーを見分けられるようにするためだけに保持します。

  • スコープ。 各キーは、calls:readやsip_trunks:writeなど、付与したスコープだけを持ちます。管理者スコープはないため、すべてを実行できるキーはありません。
  • 支出上限。 キーにはspend_limit_microsを設定できます。キーが上限まで使うと、そのキーで発信する通話は発信前に拒否されます。
  • 有効期限とローテーション。 キーにはexpires_atを設定できます。POST /v1/api-keys/{id}/rotateは代わりのキーを発行し、古いキーを24時間有効なままにするため、デプロイ中に有効なキーが1つもない瞬間は生じません。
  • 取り消し。 キーを取り消すとすぐに認証キャッシュから削除され、次のリクエストから使えなくなります。
  • 分離。 すべてのリソースは1つのアカウントに属し、すべてのクエリは要求したアカウントの範囲に限定されます。

Wixzel VoiceのMCPコネクタはどうログインしますか?

claude.ai、Claude Desktop、Claude CodeなどのAIクライアントは、APIに組み込まれたOAuth 2.1の認可サーバーを通じてWixzel VoiceのMCPサーバーに接続します。クライアントは自身を登録し(RFC 7591)、同意のためにお客様をコンソールに送り、コードをトークンと交換します。PKCEは必須で、S256のみです。plain方式は拒否されます。

クライアントが受け取るトークンは、承認したスコープだけを持つ通常のスコープ付きAPIキーで、許可を取り消すとキーも取り消されます。OAuthのエンドポイントはAPIキーを認証情報として受け付けません。クライアントはPKCEで、登録時にクライアントシークレットを設定した場合はそれも使って、自身を証明します。

Wixzel Voiceはwebhookにどう署名していますか?

すべてのwebhookのPOSTにはX-Wixzel-Signatureが付きます。これはwebhookシークレットを鍵とした、生のボディのHMAC-SHA256です。パースする前の生のバイト列で検証し、定数時間で比較してください。シークレットはローテーションしたときに1回だけ返され、GET /v1/webhookでは返されないため、読み取りスコープのキーが漏れても偽のイベントを作ることはできません。

ループバック、リンクローカル、プライベートのアドレス空間に解決されるwebhook URLは、設定時と送信時の両方で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に届きません。支払いは販売者(Merchant of Record)であるDodo Paymentsを通じて行われます。

Wixzel Voiceを不正利用から守る仕組みは?

  • APIのレート制限: キーごとに1秒あたり10リクエスト、バースト20。429にはRetry-Afterが付き、課金されることはありません。
  • ログインと新規登録はIPアドレスごと、メールアドレスごとに制限されます。パスワードはコスト12のbcryptでハッシュ化され、メールでの新規登録はそのアドレスに送ったコードで確認します。
  • コンソールのセッションはURLではなくhttpOnlyのCookieに保持されます。セッショントークンの署名アルゴリズムは固定されており、すべてのセッションを一度にログアウトできます。
  • 番号を探るSIPスキャナーは一時的に遮断されます。また、すべての着信の試行は、クレジットを確保する前に送信元アドレスごとにレート制限されるため、拒否されたトラフィックが誰かに課金されることはありません。
  • 同時通話数はアカウントごとに上限があり(デフォルトは5件)、1つのアカウントがプラットフォームのすべての回線を占有することはできません。
  • HTTPの強化:TLSへのリダイレクト、サブドメインを含む1年間のHSTS、セキュリティヘッダー、明示したリクエストボディの上限。
  • 通信事業者へのSIPはトランクに設定した転送方式を使います。デフォルトはUDPで、transportを設定すればTCPまたはTLSです。通話音声(RTP)は暗号化されません。

Wixzel Voiceはデータをどこに保存し、誰が処理しますか?

Wixzel VoiceのAPI、データベース、通話メディアは、インドのムンバイにあるHostingerで動いています。コンソールとこのWebサイトはVercelが配信しています。通話中は、エージェントのエンジンの音声・言語プロバイダー(Deepgram、ElevenLabs、OpenRouter、Google、Sarvam)が音声とテキストを処理します。これらは米国にありますが、Sarvamはインドで音声を処理します。

文字起こしと、録音した通話の録音は、削除するまで通話ログとともに保持されます。DELETE /v1/calls/{id}はログ、文字起こし、録音をまとめて削除し、コンソールからアカウントを閉じると中身はすべて一度に削除されます。リクエストログは3か月後に削除されます。各サブプロセッサーの役割と所在地を含む完全な一覧はプライバシーポリシーにあり、データ処理補遺はすべてのお客様に適用され、72時間以内の侵害通知を定めています。

Wixzel Voiceのデータはどうバックアップされていますか?

本番の2つのデータベースは毎時ダンプされます。毎週の訓練で最新のダンプを作業用のデータベースに復元し、すべてのアカウントの残高が台帳の記録の合計と一致することを確認しています。これにより、バックアップがあるだけでなく、使えることがわかります。

正直に言うと、制限が1つあります。バックアップは同じサーバー上に保管しており、他の場所にコピーはありません。不具合のあるデプロイ、破損したデータベース、誤って削除したデータには対応できますが、サーバー自体の喪失には対応できません。

Wixzel Voiceでまだ導入していないものは?

  • Wixzel Voiceは1人で運営しており、本番環境へのアクセスはその運営者に限られています。
  • SOC 2報告書やISO 27001認証はありません。
  • 通信事業者との間の通話メディアは暗号化されていません。通話音声(RTP)はSRTPなしで送られ、SIPのシグナリングはトランクの転送方式を使い、TLSを設定しない限りUDPです。
  • オフサイトのバックアップはありません。バックアップはデータと同じサーバーに保管しています。
  • APIキーを特定の送信元IPアドレスに制限する機能は、まだAPIでもコンソールでも提供していません。

Wixzel Voiceの脆弱性はどう報告すればよいですか?

aqeel@wixzel.comにメールしてください。このアドレスは/.well-known/security.txtにも掲載しています。見つけた内容、再現手順、関係するレスポンスのrequest_idを含めてください。メッセージは運営者が読み、ほとんどは1営業日以内に返信します。

テストはご自身のアカウントとデータに対してのみ行い、他のお客様へのサービスを低下させず、公開する前に修正のための妥当な期間を設けてください。

よくある質問

Wixzel VoiceはSIPトランクのパスワードをどう保存していますか?

AES-256-GCMで保存時に暗号化しています。新規・更新されたパスワードにはそれぞれ個別のメッセージ鍵があり、これはHKDFでマスター鍵から導出します。マスター鍵自体は、デプロイだけが持つシークレットからscryptで導出します。各暗号文には、書き込みに使った鍵のIDが記録されます。古い方式で保存された値も引き続き読み取れ、次に保存したときにこの方式で再暗号化されます。GCMにより、改ざんは気づかないうちに別のパスワードになるのではなく、復号の失敗になります。APIはパスワードを、お客様自身に対しても二度と返しません。

Wixzel VoiceはAPIキーを見ることができますか?

できません。キーは作成時に1回だけ表示され、保存するのはサーバー側のペッパーを鍵としたHMAC-SHA256だけです。wv_live_のプレフィックスと末尾4文字は一覧でキーを見分けられるように保持しますが、保存されたものからキーを再現することはできません。なくしたキーは作り直すしかありません。

webhookがWixzel Voiceから来たことはどう確認しますか?

webhookシークレットを使って生のリクエストボディのHMAC-SHA256を計算し、X-Wixzel-Signatureヘッダーと定数時間で比較します。シークレットはPOST /v1/webhook/rotate-secretでローテーションしたときに1回だけ表示され、GET /v1/webhookが返すことはありません。

Wixzel Voiceのデータはどこに保存されていますか?

API、データベース、通話メディアは、インドのムンバイにあるHostingerで動いています。通話中は米国とインドの音声・言語プロバイダーが音声とテキストを処理し、sarvamエンジンはインドで音声を処理します。サブプロセッサーの完全な一覧はプライバシーポリシーにあります。

Wixzel Voiceはセキュリティ認証を取得していますか?

現時点では取得していません。Wixzel Voiceは1人の運営者が運営しており、SOC 2やISO 27001の報告書はありません。このページではコードで実施している対策を説明しており、データ処理補遺では72時間以内の侵害通知を含む約束を定めています。

Wixzel Voiceのセキュリティ上の問題はどう報告すればよいですか?

見つけた内容、再現手順、関係するレスポンスのrequest_idを添えて、aqeel@wixzel.comにメールしてください。同じアドレスは/.well-known/security.txtにも掲載しています。

関連情報

最初の音声エージェントを構築