KamoCRM

Controles correctos, SSRF/guardias decredencial y correcciones cruzadas a través de VOIP

FixVOIPService
Se descapó
23 de septiembre de 2026 a las 8:54 UTC
Autor
Kamo
Compromit
da4e9f3

Los hallazgos 2-6 de la auditoría del sistema telefónico, se arreglaron juntos porque varios archivos compartidos. 2. ALTO VoipInstanceController no tenía control correcto en ningún endpoint mutante ************* cualquier miembro firmado de la org, no sólo su VOIP Admins, podría crear, eliminar o volver a identificar las credenciales de un servidor telefónico. Ahora requiere MANAGE-VOIP-SETTINGS, the same right Configuraciones -. Características - El propio teléfono está cerrado. También: plataformaUrl/baseUrl no estaban validados, por lo que un miembro podría apuntar la menta simbana de RingCentral (que envía al cliente real de la orgId/clientSecret - JWT) o un cliente de GraphQL de FreePBX en un host de sus credenciales de elección y captura, o llegar a la red de vainas (Redis/MinIO/Yugabyte todos responder no autenticado, no egress NetworkPolicy). Fijado con PhoneServerUrlGuard: RingCentral es Ahora restringido a sus dos propios presentadores (producción/sandbox); FreePBX obtiene el solo público en general Comprobar de la SSRF construido en PublicHostGuard de la biblioteca compartida de kamo (el mismo servicio primitivo de SecurityService SafeSiteFetcher y aiservice's OutboundUrlGuard. Tanto RingCentralJwtTokenService's y Los cachos simbónicos de FreePBXTokenCache fueron clavados sin el anfitrión, así que un simbón de Bearer en vivo acuñado contra el verdadero anfitrión seguiría siendo enviado a uno nuevo después de una plataformaUrl/baseUrl edit -- ambas llaves de caché ahora lo incluyen. mergeConfig ya no deja que un paseo secreto enmascarado "***" a lo largo de un el host recién establecido (debe volver a entrar), nunca fusiona la cuenta de KamoPBX asignada al servidorId/realm de un cliente, y Test Connection / sincronización manual ya no se hace eco de un mensaje de excepción en bruto (que podría llevar el huéstre de destino o un fragmento de respuesta de vuelta al llamante). ApiKey de Telnyx se sumó a SECRET-FIELDS. 3. ALTO.- MiembroVoipConfigEl PUT de la Controller sólo comprobó que el miembro objetivo estaba en el que llamaba org. Cualquier miembro firmado podría reasignar un COLLEAGUE ********************** y SipController.getSipCredentials devuelve cualquier extensión que se asigne actualmente - a la toma de cuentas del mismo-org primitivo, no sólo un IDOR. Ahora requiere MANAGE-EXTENSIONS o MANAGE-VOIP-SETTINGS incondicionalmente, que coincide con el propio comentario de la interfaz de configuración de la propia interfaz de usuario-Día asignación es administrada por administración y nunca autoservicio. instanceId ahora también se ha marcado con el llamada org -- anteriormente un servidor de teléfono de una organización diferente podría ser nombrado y, si Una de sus extensiones resultó no asignada, afirmó. 4. ALTO no hay cheques correctos en ninguna parte de: ************* (crear/actualizar/borrar/ Test/test-send/send), VoipDevicesController, VoipUsersController, VoipExtensionsController, VoipOrgAggregateController, OrgPhoneNumberController, miembroPhoneNumberController. La mayoría ahora exigir la derecha, la correspondiente pantalla kamo-internal en la que está cerrada (MANAGE-VOIP-SETTINGS para el inventario de teléfono-servidor / pantallas de números, ************* para cesión de prórroga). VoipOrgAggregateControllers /org/voicemails adicionalmente requeridos VERW-VOICEMAIL específicamente (que coincide con VoipVoicemailController, no el default org-aggregate) y obtuvo la misma llamada de auditoría de la transcripción de PHI. BulkTextInstanceController /send enviado SMS arbitrario sin consentimiento de salida/puerta de la supresión - ahora rechaza (409) un número que La última Consentimiento TCPA-SMSRecord es REVOKED, leyendo el libro de Lábricas SmsKeywordService ya escribe en cada STOP/START entrando, inquilino-enfocón tan STOP a un org diferente nunca bloquea esto uno. MiembroPhoneNumberController es la única excepción a "principio requerido, período": a diferencia de VOIP ampliación/asignación de la explotación (acontinuación 3, sin ruta de autoservicio en absoluto por producto explícito decisión -- la configuración El propio comentario de la interfaz de configuración lo dice), la configuración/miembro Pestaña Teléfono El Estado-responsaloCard ofrece a cada espesionista controles de autoservicio completos (asignación/quita/make-primaria) sobre sus números OWN sin puerta de administración propia - esa página es accesible en ACCESS-VOIP por sí solo, por su propio comentario: "ACCESS* cubre al usuario gestionando sus propias configuraciones; MANAGE* covers adputs configurándose en nombre de un miembro". Así que este controlador tiene una regla de auto-o-admin en su lugar (espejos ************* forma existente): un miembro maneja sus propios números sin derecho especial; actuar sobre la base de un colega todavía requiere MANAGE-EXTENSIONS o MANAGE-VOIP-SETTINGS. Una regla de administración aquí tendría 403'd cada miembro de ACCESS-VOIP-Sólo de una tarjeta que funciona hoy. 5. MEDIUM . **************** el índice único en ORG.PHONE. (org.id, phone-canon), no solo (teléfonocanon) solo (deliberadamente, por lo que la historia de un número portado puede existen bajo dos organizaciones con el tiempo) - pero nada impidió que un org SEGUNDO creara su filas para un número un PRIMERO org ya se celebró activamente, desde get(()/encontrarByNumber() son org-scoped y simplemente no encontraría la fila del otro org. save() ahora se niega a crear una nueva fila cuando otro org ya tiene una reclamación activa sobre el mismo número; descubrimiento (que le pregunta al proveedor propia, evidencia real de propiedad) está intacta. MemberPhoneNumberService's assign/" setPrimary/forMember validado numberId contra el org pero nunca miembroId en absoluto -- combinado con la asignación de dicho () a través de la escritura de MemberVoipConfig (considerado por el miembro id alone), una persona que llama en uno org podría volver a señalar a un miembro REAL de un miembro de la llamada de salida de un DIFFERENTE ORG en su propio teléfono infraestructura. requireMemberInOrg es la solución. 6. LOW (perf) . InstanceSyncService volvió a guardar cada extensión en caché/usuario/dispositivo/voicemail fila en Cada barrido con una fecha de baploActualizado, incluso cuando el proveedor no reportó nada diferente... UPDATEs/día evitable. Cada uno de los cuatro métodos de sincronización ahora se compara cada campo antes de escribir sólo ahorra cuando algo realmente cambió. Pruebas: PhoneServerUrlGuardTest, **************** ********** RingCentralJwtTokenServiceTest (caso nuevo), FreePBXTokenCacheTest, **************** ******************* ************* ******* ******************* ********** (autoservicio permitido, miembro cruzado requiere el derecho de administración, ambos derechos aceptados), *************Adiciones solo derechos a ********************** fueron verificados por revisión de código y compilación completa de suite en lugar de una prueba dedicada por controlador - el patrón es idéntico y ya cubierto por **************** y **************** Todos los guardias anteriores fueron revisados por mutación (revertido localmente, confirmado que la prueba coincidente se vuelve roja, restaurada). Tres pruebas preexistentes de VoipInstanciaController **************** voipInstanceJustCallIdTest, **************** anterior al hallazgo 2 y construyó su sesión sin lista de derechos en absoluto; Ahora incluyen MANAGE-VOIP-SETTINGS para que todavía ejerzan el comportamiento para el que fueron escritos (aprovisionamiento de Retry, JustCall id adoption, JWT-shape valido) en lugar de tropezar primero con el nuevo cheque correcto. ******************* caso FreePBX también intercambió un lugar de posición no resuelto "pbx.example.com" para una IP literal, ya que la base de PhoneServerUrlGuard comprueba ahora realiza una verdadera lucición DNS. Informe para el coordinador: sin cambios de esquema, sin cambios de configuración, sin cambios de puerta de entrada para estos seis hallazgos (sólo el informe de la primera se encuentra en curso de seguimiento operativo). Confirmado en contra apiservice: reenvía /api/voip/** al por mayor, por lo que los hallazgos 2, 3, 5 y 6 no necesitan nada allí. BulkTextInstanceController (encontrada 4) se encuentra en /api/bulktext/instances/**, que apiservice NO wildcard (sólo /api/bulktext/inbound/** es público, custodiando el interior X-Internal-Auth /api/bulktext/send de estar accesible desde Internet) -- pero nunca necesario para: el propio servidor de kamo-internal llega directamente a través ******************* que se presenta a VOIPSERVICE-URL, sorteando al público Porera por completo. Nada que cambiar a ambos lados.

Todos los cambios

Como lo que ves enviaste?

Todo llega a su espacio de trabajo por sí solo. Comience en el plan gratuito y lea esta página de nuevo en un mes.

Arranzar gratis para siempreVer Precios