Reģ. Nr. 40203410806PVN LV40203410806

Tēma

Pieteikt konsultācijuPieteikt

03 / 10Ievainojamības atklāšana

Autorizācijas apiešana 8x8 JaaS SIP zvanu vārtejā

Jitsi as a Service (JaaS) – 8x8 SIP vārteja

OffSeq atklāja autorizācijas apiešanu JaaS SIP vārtejā – izejošo zvanu pakalpojumā, kas darbina 8x8 platformu Jitsi as a Service. Ielūguma galapunkts lēmumu par to, vai nomnieks drīkst veikt izejošos SIP zvanus, pieņēma, nolasot funkcijas atļauju no paša zvanītāja pilnvaras – vērtību, ko nosaka pats nomnieks –, nevis no nomniekam piešķirtajām tiesībām. Tādēļ jebkurš JaaS nomnieks bez maksas SIP izejošo zvanu funkcijas varēja likt 8x8 trunk zvanīt uz uzbrucēja izvēlētu galamērķi ar uzbrucēja kontrolētu zvanītāja ID, kas tiek uzrādīts no @8x8.vc. 8x8 to novērsa divos posmos savā HackerOne programmā.

Kritiskums: VidējsCVSS5.86 min lasīšanai

§ 01. Pārskats

Jitsi as a Service (JaaS) ir 8x8 mitinātā Jitsi Meet steka versija: nomnieki iegulst video sanāksmes savos produktos, izmantojot katram nomniekam unikālu AppID un API atslēgu. Viena no tās maksas funkcijām ir SIP izejošie zvani – iespēja sanāksmei zvanīt uz tālruni vai SIP galapunktu, izmantojot 8x8 telefonijas trunk. Tas, vai nomniekam ir tiesības uz šo funkciju, ir daļa no viņa abonementa un tiek reģistrēts servera pusē.

OffSeq atklāja, ka SIP vārteja šīs tiesības neievēroja. Galapunkts, kas veic zvanu, POST /sip-jibri-gateway/jibris/invite, nolasīja sip-outbound-call funkcijas atļauju no zvanītāja JSON tīmekļa pilnvaras (JWT) un tai uzticējās – taču JaaS pilnvaras tiek pašparakstītas ar nomnieka paša API atslēgu, tādēļ tieši nomnieks, nevis 8x8, izlemj, ko šī atļauja saka. Nomnieks bez SIP izejošo zvanu tiesībām varēja apgalvot šo atļauju pats savā parakstītā pilnvarā un veikt reālu izejošo zvanu. Tā kā galamērķi izvēlas uzbrucējs un From identitāte tiek piegādāta no @8x8.vc, šī pati nepilnība ir telefonijas krāpšanas un zvanītāja ID viltošanas primitīvs. 8x8 to novērsa divos labošanas posmos.

§ 02. Nomnieka pilnvaras un SIP vārteja

JaaS nomnieks autentificējas API ar JWT, ko tas paraksta, izmantojot savu API atslēgu (kid = <AppID>/<keyId>). Pilnvara satur context.features objektu, kas apraksta, ko sesija drīkst darīt – ierakstīšanu, transkripciju, SIP izejošos zvanus un tā tālāk. Produktā šo objektu aizpilda 8x8 lietotāja saskarne, lai tas atspoguļotu nomnieka plānu, un klients piedāvā SIP ielūguma pogu tikai tad, kad context.features["sip-outbound-call"] ir iespējots. Tā ir klienta puses ērtība, nevis drošības robeža: nomnieks tur parakstīšanas atslēgu, tādēļ tas var ielikt jebkādas vērtības pilnvarā, ko pats izveido.

Pašu zvanu vārteja piedāvā šeit:

POST https://api-vo.cloudflare.jitsi.net/sip-jibri-gateway/jibris/invite

Pieprasījums nosauc mērķa sanāksmi ar callParams.callUrlInfo.baseUrl = https://8x8.vc/<AppID> un vienu vai vairākus SIP galamērķus laukā sipClientParams.sipAddress (masīvs). Autoritatīvo skatu uz to, kādas tiesības nomniekam patiešām ir piešķirtas, publicē pati 8x8 aktuatora saskarne, kas uzskaita funkcijas, kuru nomniekam nav:

GET /jaas-actuator/v1/public/tenants/<AppID>
disabledFeatures = ["outbound-call","sip-outbound-call","recording","livestreaming","transcription"]

Šajā atklāšanā izmantotajam testa nomniekam (vpaas-magic-cookie-514344fe95db4894bd93aa8a803e3cdc) sip-outbound-call ir sarakstā disabledFeatures – tam nav piešķirtas SIP izejošo zvanu tiesības. Tieši šo faktu vārtejai bija jāpārbauda, un tā to nedarīja.

§ 03. Cēlonis: autorizācija pēc pašapgalvota apgalvojuma

Galapunkts autorizācijas lēmumu pieņēma no pilnvaras sip-outbound-call apgalvojuma, nevis no nomnieka faktiskajām tiesībām. Tā kā nomnieks paraksta pats savu pilnvaru, apgalvojumu kontrolē uzbrucējs: pietiek pašparakstītā JWT apgalvot sip-outbound-call: "true", lai tiktu uzskatīts par tiesīgu, neatkarīgi no abonementa. Tā ir CWE-863 (nepareiza autorizācija), kas sasniegta caur CWE-807 (paļaušanās uz neuzticamu datu ievadi drošības lēmumā).

To padara nepārprotamu kontrasts ar pašas 8x8 pārējām funkcijām. Ierakstīšanai un transkripcijai tāda paša veida pašparakstīta pilnvara no tā paša neatbilstošā nomnieka tiek noraidīta – vārteja atbild <error type="auth"><forbidden/></error>, jo šie ceļi autorizē pret nomniekam piešķirtajām tiesībām, nevis pret pilnvaras apgalvojumu. SIP izejošie zvani bija vienīgā funkcija, kas uzticējās apgalvojumam.

Blakus atradās otra, saistīta nepilnība: mērķa sanāksmes nomnieks (baseUrl) nebija piesaistīts pilnvaras laukam sub, tādēļ viena nomnieka pilnvara varēja virzīt zvanu, kas tiek attiecināts uz citu nomnieku – darbības un tās izmaksu starpnomnieku attiecināšana.

§ 04. Koncepcijas pierādījums

Uzvedība tika demonstrēta no sākuma līdz beigām pret OffSeq kontrolētu resursdatoru, kas klausās UDP portā 5060. Pietiek ar vienu ielūgumu, kas satur pašparakstītu pilnvaru no neatbilstošā testa nomnieka:

http

POST /sip-jibri-gateway/jibris/invite HTTP/1.1
Host: api-vo.cloudflare.jitsi.net
Authorization: Bearer <self-signed JaaS JWT; context.features.sip-outbound-call = "true">
Content-Type: application/json

{
  "callParams": {
    "callUrlInfo": { "baseUrl": "https://8x8.vc/<AppID>", "callName": "offseqsipproof" },
    "passcode": null
  },
  "sipClientParams": { "displayName": "OffSeq-PoC", "sipAddress": ["sip:offseq@<host-we-control>:5060"] }
}

Vārteja to pieņem un ziņo, ka ielūgums ir veikts:

http

HTTP/1.1 200
{"successfulInvites":[{"sipAddress":"sip:offseq@<host-we-control>:5060"}],"failedInvites":[]}

Dažu sekunžu laikā 8x8 SIP infrastruktūra nosūta īstu INVITE – vairāku sekunžu garumā retranslētu, reālu zvana izveidi, uz kuru resursdators apzināti neatbildēja – ar pilnu audio un video SDP piedāvājumu un uzbrucēja piegādātu attēlojamo vārdu, kas tiek uzrādīts no @8x8.vc:

IP 3.147.160.14.5060 > <our-host>.5060: SIP: INVITE sip:offseq@<our-host> SIP/2.0
  From:    "OffSeq-PoC" <sip:[email protected]>;tag=...
  To:      <sip:offseq@<our-host>>
  Via:     SIP/2.0/UDP 3.147.160.14:5060 ; SIP/2.0/UDP 108.177.136.5:5090
  Contact: <sip:[email protected]:5090>
  Content-Type: application/sdp   (m=audio opus/PCM/AMR + m=video H264/VP8, a=sendrecv)

Katrs šajā darbā veiktais ielūgums bija vērsts tikai uz OffSeq kontrolētiem resursdatoriem un nomniekiem; netika izsaukts neviens PSTN, paaugstinātas maksas vai trešās puses numurs, un pieprasījumu apjoms tika ierobežots līdz minimumam, kas nepieciešams uzvedības pierādīšanai.

§ 05. Ietekme un kritiskums

Atradums tika publicēts ar CVSS 5.8 (vidējs) – pazemināts no sākotnēji kritiska novērtējuma pēc tam, kad tika noskaidrots, ka vektoram ir nepieciešama nomnieka pilnvara, nevis tas ir pilnībā neautentificēts. Šajā modelī ietekme ir konkrēta:

  • Telefonijas krāpšana. Nomnieks bez maksas SIP izejošo zvanu funkcijas liek 8x8 trunk veikt izejošos zvanus uz paša izvēlētiem galamērķiem. sipAddress ir masīvs, tādēļ viens pieprasījums var izvērsties uz daudziem galamērķiem – izmaksu pastiprināšana. Vērsts uz PSTN vai paaugstinātas maksas vārteju, tas ir tiešs finansiāls zaudējums.
  • Maksas funkcijas apiešana. SIP izejošo zvanu tiesības vienkārši netiek ievērotas; nomnieks bez tām tās tik un tā izmanto.
  • Starpnomnieku attiecināšana. Tā kā zvana mērķa nomnieks nav piesaistīts pilnvarai, darbību un izmaksas var attiecināt uz upura nomnieku.
  • Zvanītāja ID / identitātes viltošana. Uzbrucēja kontrolētais attēlojamais vārds tiek piegādāts no @8x8.vc, aizņemoties 8x8 uzticamo trunk identitāti pikšķerēšanai vai vishing uzbrukumiem.

Kritiskumu mazina prasība pēc nomnieka pilnvaras, taču primitīvs – neautorizēts izejošs zvans uz uzticama telefonijas trunk ar viltojamu identitāti – ir tieši tāds, kādu vēlas krāpšanas vai sociālās inženierijas operācija.

§ 06. Labojums divos posmos

8x8 pirmais labojums, kas tika izvietots pirmajai atkārtotajai pārbaudei, bloķēja burtisko koncepcijas pierādījumu: vārteja sāka nolasīt sip-outbound-call apgalvojumu (tādēļ sākotnējā pilnvara, kas saturēja false, tika noraidīta) un piesaistīja sub laukam baseUrl (aizverot starpnomnieku vektoru). Taču tā nolasīja apgalvojumu no pilnvaras – vērtības, ko kontrolē nomnieks –, tādēļ pamatā esošā autorizācijas nepilnība palika neskarta. OffSeq atkārtotā pārbaude parādīja apiešanu ar viena lauka izmaiņu tajā pašā pašparakstītajā pilnvarā:

Uzrādītā pilnvarasip-outbound-call apgalvojumsVārtejas atbilde
nav401 Unauthorized
pašparakstīta, bez tiesībāmfalse (sākotnējais PoC)403 Forbidden
pašparakstīta, bez tiesībāmtrue200 · zvans veikts
pašparakstīta, bez tiesībām, cita nomnieka baseUrltrue403 Forbidden
1. tabulaPēc pirmā labojuma: vārteja uzticas paša JWT apgalvojumam, tādēļ nomnieks, kuram nav piešķirtas SIP izejošo zvanu tiesības, tik un tā veic zvanu, apgalvojot true. Starpnomnieku vektors ir aizvērts.

Risinājums ir tas pats, ko 8x8 pārējās funkcijas jau piemēroja – autorizēt pret nomnieka faktiskajām tiesībām (tā disabledFeatures), nevis pret pašapgalvoto apgalvojumu. 8x8 otrais labojums izdarīja tieši to. Noslēdzošajā atkārtotajā pārbaudē tā pati pašparakstītā sip-outbound-call: "true" pilnvara, kas iepriekš bija veikusi zvanu, tagad atgriež 403 Forbidden, savukārt neautentificēts pieprasījums joprojām atgriež 401 – pierādījums, ka galapunkts pēc autentifikācijas pieņem īstu, katram pieprasījumam atsevišķu autorizācijas lēmumu, nevis ir vispārēji atspējots. 403 atbildes ir pašas lietotnes JSON ({"messageKey":"forbidden","path":"/sip-jibri-gateway/jibris/invite"}), nevis malas (edge) bloķēšana.

§ 07. Atklāšana un iznākums

Ievainojamība tika paziņota 8x8, izmantojot to HackerOne programmu, 2026. gada 2. jūlijā un izvērtēta tajā pašā dienā kā vidēja (5.8). OffSeq pirmā atkārtotā pārbaude (6. jūlijā) parādīja, ka sākotnējo labojumu var apiet, apgalvojot atļauju; sekoja otrs labojums, un OffSeq otrā atkārtotā pārbaude (13. jūlijā) apstiprināja, ka tas darbojas. 8x8 atrisināja ziņojumu, un tas tika publiski atklāts 2026. gada 12. augustā.

§ 08. Atklāšanas hronoloģija

  1. 2026-07-02OffSeq ziņo 8x8 par izejošo SIP zvanu autorizācijas apiešanu, izmantojot HackerOne; izvērtēts tajā pašā dienā un pārskatīts no sākotnēji kritiska uz vidēju (5.8)
  2. 2026-07-06Izvietots pirmais labojums; OffSeq atkārtotā pārbaude parāda, ka apiešana joprojām pastāv – vārteja tagad nolasa paša JWT SIP izejošo zvanu apgalvojumu, ko kontrolē nomnieks
  3. 2026-07-09Pēc atkārtotās pārbaudes izvietots otrs labojums; 8x8 pieprasa vēl vienu pārbaudi
  4. 2026-07-13OffSeq apstiprina, ka otrais labojums darbojas; 8x8 atzīmē ziņojumu kā atrisinātu
  5. 2026-08-12Ziņojums publiski atklāts

Vai jūsu vidē pastāv līdzīgs risks?