- Navios
- 23 de setembro de 2026 às 08:54 UTC
- Autor
- Kamo
- Enviar
- da4e9f3
Encontra 2-6 da auditoria telefone-sistema, fixo juntos porque vários arquivos de compartilhamento. 2. HIGH — VoipInstanceController não tinha o direito de verificar qualquer ponto final mutante ************* qualquer membro da org, não apenas o seu VOIP administradores, poderia criar, excluir ou remarcar credenciais de um servidor de telefone. Agora requer MANAGEM VOIP SETTINGS, as mesmas configurações direitas -> Características -> O telefone está ligado. Além disso: plataformaUrl/baseUrl não foram validados, então um membro poderia apontar a moeda token do RingCentral (que envia o cliente real do orgId/clientSecret + JWT) ou um cliente FreePBX GraphQL em um host de suas credenciais de escolha e captura, ou chegar à rede pod (Redis/MiniO/Yugabyte todos resposta não autenticada, sem saída da Política de Rede). Fixo com PhoneServerUrlGuard: RingCentral is agora restrito a seus próprios dois hosts (produção/sandbox); FreePBX obtém o público-somente Verificação SSRF construída sobre o PublicHostGuard (o mesmo Serviço de Segurança primitivo SafeSiteFetcher e aiservice's OutboundUrlGuard use). Ambos RingCentralJwtTokenService e Os caches de token do FreePBXTokenCache foram chaveados sem o host, então um token de portador ao vivo cunhado contra o host real continuaria sendo enviado para um novo após uma plataformaUrl/baseUrl edit -- ambas as chaves de cache agora incluem-no. mergeConfig já não permite um passeio secreto "***" mascarado máquina recém- definida (deve ser re-entrada), nunca funde a conta atribuída ao servidor do KamoPBXId/realm de um cliente, e Test Connection / manual sync já não ecoam uma mensagem de exceção bruta (que poderia transportar a máquina de destino ou um fragmento de resposta de volta para o chamador). ApiKey do Telnyx adicionado a SEGREDOS. 3. HIGH — MembroVoipConfigController's PUT apenas verificou que o membro alvo estava no org. Qualquer membro que se inscreva pode reatribuir o nome de um COLEAGUE. SipController.getSipCredentials devolve qualquer extensão atualmente atribuída -- a o mesmo-org conta-tomada primitiva, não apenas um IDOR. Agora requer GESTÃO EXTENSÕES ou GERÊNCIA VOÍP SETTINGS incondicionalmente, combinando as configurações do próprio comentário da UI A atribuição é administrada e nunca auto-serviço. O plasseId também é verificado org -- anteriormente um servidor de telefone de uma organização diferente poderia ser nomeado e, se Uma das suas extensões não foi atribuída, alegou. 4. ALTO — nenhum direito verifica em qualquer lugar sobre: **************** (criar/atualizar/excluir/ teste-enviar/enviar), VoipDevicesController, VoipUsersController, VoipExtensionsController, VoipOrgAggregateController, OrgPhoneNumberController, MemberPhoneNumberController. A maioria agora require o direito em que a tela kamo-internal correspondente está ligada (MANAGE VOIP SETTINGS para o inventário de telefone-servidor / ecrãs de números, ************* para atribuição de extensão). VoipOrgAggregateController /org/voicemails adicionalmente necessários VER VOICEMAIL especificamente (combinando VoipVoicemailController, não o padrão org-aggregate) e ganhou a mesma chamada de auditoria da PHI. Enviar /enviar para BulkTextInstanceController SMS arbitrário sem autorização de saída / porta de supressão -- agora recusa (409) um número cujo mais recente TCPA SMS consentimentoRecord é REVOKED, lendo o livro de registro WORM SmsKeywordService já escreve em cada entrada STOP/START, locatário-escoberto para que um STOP para uma org diferente nunca bloqueia este Uma. MemberPhoneNumberController é a única exceção para "admin right required, period": ao contrário de VOIP atribuição de extensão/instanciamento (encontrando 3, nenhum caminho de auto-serviço em tudo por produto explícito decision -- o próprio comentário da UI de configurações diz isso), a aba configurações/membro do telefone MemberTextNumbersCard oferece a cada visualizador controles completos de auto-serviço (atribuir/remover/make-primary) sobre seus próprios números sem portão de administração -- essa página é acessível no ACCESS VOIP sozinho, por seu próprio comentário: "ACCESS * cobre o usuário gerenciando suas próprias configurações; MANAGEM * cobre administradores configurando em nome de um membro." Então, este controlador tem uma regra de auto- ou administração em vez Um membro controla o seu trabalho. seus próprios números sem direito especial; agindo sobre um colega ainda requer MANAGEM EXTENSIONS ou MANAGEM VOIP SETTINGS. Uma regra só de administrador aqui teria 403'd cada membro ACESS VOIP-somente de um cartão que funciona hoje. 5. MÉDIO — ************* o índice único em ORG PHONE NUMBER é (org id, phone canon), não (phone canon) sozinho (deliberadamente, então o histórico de um número portado pode existem sob duas organizações ao longo do tempo) -- mas nada impediu uma segunda org de criar sua linha própria para um número uma primeira org já realizada ativamente, desde get()/findByNumber() são org-scoped e simplesmente não encontraria a linha da outra org. save () agora se recusa a criar uma nova linha quando outra org já tem uma reivindicação ativa sobre o mesmo número; descoberta (que pede ao provedor Em si mesmo, verdadeira evidência de propriedade) está intocado. MembroPhoneNumberService's assign/unassign/ setPrimary/forMember validated numberId contra a org mas nunca memberId -- combinado com write-through do atribule() para o MemberVoipConfig (procurado somente pelo membro id), um chamador em um Org poderia remarcar um membro real de um identificador de chamada de saída de Org diferente em seu próprio telefone infra-estruturas. requireMemberInOrg é a solução. 6. LOW (perf) — instanceSyncService re-saved every cached extension/user/disvice/voicemail row on Cada varredura com uma data amassada Atualizada, mesmo quando o provedor não relatou nada diferente... ~23k ATUALIZAÇÃO EVENTÁVEL/dia. Cada um dos quatro métodos de sincronização agora compara cada campo antes de escrever E só salva quando algo realmente mudou. Testes: PhoneServerUrlGuardTest, **************************** RingCentralJwtTokenServiceTest (novo caso), FreePBXTokenCacheTest, ************* **************************** **************************** **************************** **************************** **************************** (auto-serviço permitido, membro cruzado requer o direito de administração, ambos os direitos aceitos), ********************************** Adições de direitos ******************* foram verificados por revisão de código e compilação completa em vez de um teste dedicado por controlador -- o padrão é idêntica e já coberta por... Cada guarda acima foi verificada por mutação (revertido localmente, confirmado que o teste de correspondência vai vermelho, restaurado). Três testes de VoipInstanceController preexistentes **************************** VoipInstanceChallIdTest, **************************** Predate finding 2 e construiu a sua sessão sem lista de direitos; eles agora incluem MANAGEM VOIP SETTINGS para que eles ainda exerçam o comportamento para o qual foram escritos (provisionando Tente novamente, JustCall id adoption, validação em forma de JWT) em vez de tropeçar na nova verificação à direita primeiro. **************************** O caso FreePBX também trocou um placeholder "pbx.example.com" sem resolução para um IP literal, já que a verificação baseUrlGuard do PhoneServer agora realiza uma busca DNS real. Relatório para o coordenador: sem alterações de esquema, sem alterações de configuração, sem alterações de gateway necessárias estas seis constatações (apenas o relatório do achado 1 tem um acompanhamento operacional). Confirmado contra apiservice: ele encaminha /api/voip /** atacado, por isso as descobertas 2, 3, 5 e 6 não precisam de nada lá. BulkTextInstanceController (encontrando 4) está em /api/bulktext/instances/**, que apiservice deliberadamente NÃO é wildcard (apenas /api/bulktext/inbound/** é público, guardando o interno X-Internal-Auth /api/bulktext/enviar de ser acessível da internet) -- mas nunca necessário para: o servidor do próprio kamo-internal o alcança diretamente através de ************* que proxies para VOIPSERVICE URL, ignorando o público Portão inteiramente. Nada a mudar de um lado para o outro.
