- Expédié
- 23 septembre 2026 à 08:54 UTC
- Auteur
- Kamo
- Commite
- da4e9f3
Les résultats 2 à 6 de l'audit du système téléphonique, ont été corrigés ensemble parce que plusieurs partagent des fichiers. 2. HIGH et VoipInstanceLe contrôleur n'a pas eu de bon contrôle du critère d'évaluation en mutation. - tout membre de l'organisation signé, et pas seulement sa VOIP; les administrateurs, pourraient créer, supprimer ou repointer les identifiants d'un serveur de téléphone. Maintenant, il faut maintenant MANAGE-VOIP-SETTINGS, le même réglage correct - Caractéristiques - Le téléphone lui-même est fermé. Aussi: plate-formeUrl/baseUl n'a pas été validé, de sorte qu'un membre pourrait pointer la menthe de RingCentral (qui envoie le client réel de l'organisation/clientSecret et JWT) ou un client FreePBX GraphQL chez un hôte de leurs références de choix et de capture, ou d'atteindre le réseau de nacelles (Redis/MinIO/Yugabyte tous répondre sans aterfectation, pas de sortie NetworkPolicy). Fixé avec PhoneServerUrlGuard: RingCentral is désormais limité à ses deux hôtes (production/boîte à café); FreePBX obtient le grand public SSRF check built on kamo-shared-library's PublicHostGuard (le même primitif SecurityService's Utilisation de SafeSiteFetcher et de l'utilisation de OutboundUrlGuard d'aili). RingCentralJwtTokenService (États-Unis d'Amérique) Les caches de jetons de FreePBXTokenCache ont été mis à la cléuté sans l'hôte, donc un jeton de porteur en direct a frappé contre le véritable hôte continuerait d'être envoyé à un nouvel accueil après qu'une plate-formeUrl/baseUrl édirait -- la fusion Confixe pas plus un secret masqué "-" se déplaçant jusqu'à un "-" l'hôte nouvellement mis en place (doit être réintroduite), ne fusionne jamais le compte attribué au serveur de KamoPX/realm à partir de un client, et Test Connection / synchronisation manuelle ne font plus écho à un message d'exception brut (qui pourrait porter l'hôte de destination ou un fragment de réponse à l'appelant). L'apiKey de Telnyx ajouté à SECRET-FIELDS. 3. HIGH - MemberVoipConfigure's PUT ne fait que vérifier que le membre cible était dans l'appelant org. Tout membre inscrit pourrait réaffecter un COLLEAGUE SipController.getSipCredentials répond à toute extension actuellement attribuée -- a Prêt primitif du même emprunt, pas seulement un IDOR. Maintenant, il faut des autorisations de gestion ou MANAGE-VOIP-SETTINGS sans conditions, en faisant correspondre le commentaire de l'UI des paramètres que cette extension L'attribution est gérée par l'administration et n'est jamais en libre-service. l'orge de l'appelant - auparavant un serveur téléphonique d'une organisation différente pourrait être nommé et, si L'une de ses extensions n'était pas attribuée, a-t-elle affirmé. 4. HAUT : aucun contrôle n'a été effectué sur : test/essai-send/send), VoipDevicesContrôleur, VoipUsersController, VoipExtensionsContrôleur, VoipOrgAggregateController, OrgPhoneNumberController, MemberPhoneNumberController. La plupart d'entre eux aujourd'hui exiger que l'écran kmo-interne correspondant lui-même soit fermé sur (MANUI-VOIP-SETTINGS pour les écrans d'inventaire/numéros de serveur téléphonique, l'attribution de la prolongation). VoipOrgAgregateController's /org/voicemails requis en plus VISUEILLE VISUEILLE VISUEILLE VISIVÉVOICEMAIL (en correspondance avec VoipVoicemailController, et non par défaut d'orgaggregate) et ont obtenu le même appel d'audit de la publication des relevés de compte rendu des EIP. BulkTextInstanceClucheeur/send envoyé SMS arbitraire sans consentement/porte de suppression sortant - il refuse maintenant (409) un numéro dont Le dernier avis de consentement de TCPA-SMS est REVOKED, en lisant déjà le registre WORM SmsKeywordService écrit sur chaque STOP/START entrant, fermier-lâtre donc un STOP à un organisme différent ne bloque jamais cela l'un. MemberPhoneNumberClustoller est la seule exception à "l'admin right requis, period": contrairement à la VOIP extension/d'affectation d'instance (recherche 3, pas de chemin en libre-service du tout par produit explicite décision -- le commentaire de l'UI indique ainsi), le paramètre/l'onglet Téléphone du membre MemberTextNumbersCard offre à chaque spectateur des commandes en libre-service complète (résignation/déménagement/créance primaire) sur leurs nombres de PROPREAU sans porte d'administration seule - cette page est accessible sur ACCESS-VOIP seul, selon son propre commentaire: "ACCESS- couvre l'utilisateur qui gère ses propres paramètres; les administrateurs configurant au nom d'un membre." Donc ce contrôleur a eu une règle d'auto- ou d'admin à la place (miroirs et formes existantes): un membre gère leurs propres numéros sans droit spécial; agir sur celui d'un collègue nécessite toujours des autorisations de gestion ou MANAGE-VOIS-SETTINGS. Une règle d'administration uniquement ici aurait 403'd chaque membre uniquement d'ACCES-VOIP d'une carte qui fonctionne aujourd'hui. 5. MOYEN-NEIEME: l'indice unique sur ORG-PHONE-NUMBER est (org-id, téléphone-canon), pas (y compris le canon) seul (délibéré, donc l'historique d'un nombre porté peut n'a pas encore d'objection à créer propre ligne pour un nombre FIRST org déjà détenu activement, puisque get()/findByNumber() sont org-arcardé et ne trouverait pas la rangée de l'autre og. save() refuse maintenant de créer une nouvelle ligne quand une autre gisure a déjà une créance active sur le même nombre; découverte (qui demande au fournisseur elle-même, preuve réelle de la propriété) n'est pas affectée. Affectation/non-signe/de la liste de membresNumberService setPrimaire/pour le membre validé numéroId contre l'org mais jamais membreId du tout -- combiné avec l'envoi d'inscription() par écrit à MemberVoipConfig (regardé par le membre seul), un appelant en un org pourrait repointer un REAL MEMBRE DE L'appelant sortant d'ORG DIFFÉRENT id à son propre téléphone l'infrastructure. requireMemberInOrg est la solution. 6. FAIBLE (parf) - InstanceSyncService a re-sauvegardé toutes les lignes d'extension/utilisateur/device/voix maillées mises en cache sur chaque balayage avec une date bousculéeMisement, même lorsque le fournisseur a signalé rien de différent -- MISE À JOUR/jour évitables. Chacune des quatre méthodes de synchronisation compare maintenant chaque champ avant l'écriture Il n'épargne que quand quelque chose a changé. Tests : PhoneServerUrlGuardTest, RingCentralJwtTokenServiceTest (nouveau cas), FreePBXTokenCacheTest, (en cas de libre-service autorisé, inter-membres exige le droit d'administration, les deux droits acceptés), et les ajouts uniquement aux droits - ont été vérifiées par examen du code et compilation complète plutôt que par test dédié par contrôleur - le modèle est identiques et déjà couverts par les Chaque garde ci-dessus a été vérifié par mutation (retourné localement, confirmé que le test de correspondance devient rouge, restauré). Trois tests de VoipInstancePluie préexistants - VoipInstanceJustCallIdTest, - Précéder la date de la recherche 2 et la construction de leur session sans aucune liste de droits; Ils incluent maintenant MANAGE-VOIP-SETTINGS afin qu'ils exercent toujours le comportement pour lequel ils ont été écrits (approvisionnement (Essai, adoption JustCall id, validation JWT-shape) plutôt que de déclencher le nouveau bon contrôle d'abord. L'affaire FreePBX a également échangé un espace réservé à l'espace réservé "pbx.example.com". pour un IP littéral, puisque le test de base de PhoneServerUrlGuard effectue maintenant une véritable recherche DNS. Rapport pour le coordonnateur: pas de changement de schéma, pas de changement de configuration, pas de changement de passerelle nécessaire pour ces six conclusions (seuls le rapport de la première date est un suivi opérationnel). Confirmé contre apiservice: il transmet /api/voip/- gros, donc les résultats 2, 3, 5 et 6 n'ont rien besoin. BulkTextInstanceController (trouvête 4) se trouve à /api/bulktext/instances/-, qui apiservice volontairement ne fait PAS de caractères génériques (uniquement /api/bulktext/inbound/- est public, la protection interne X-Internal-Auth /api/bulktext/send over accessible depuis Internet) -- mais jamais nécessaire pour: le propre serveur de kamo-internal lui parvient directement par le biais - qui s'adresse à VOIPSERVICE-URL, en contournant le public Portail entièrement. Rien à changer de part et d'autre.
