Atribuição de Permissão Insegura para a Loja de Tokens Garmin OAuth. `garminconnect` (≤ 0.3.4 ) escreveu sua loja de tokens OAuth para o disco sem restringir permissões do sistema de arquivos. Sob a umask padrão Linux (` 022 `) o arquivo token `garmin_tokens.json` foi criado para leitura mundial (` 0 o 644 `). O arquivo contém o símbolo DI **refresh**, para que qualquer outro usuário local em um hospedeiro compartilhado possa lê- lo e obter acesso persistente e não autorizado à conta Garmin Connect da vítima. - **Severidade:** Alta - ** Fraqueza:** CWE- 732 (Atribuição de Permissão Incorreta para o Recurso Crítico) - ** versões afetadas:** `<= 0.3.4 ` - ** Versão em parêntese:** ` 0.3.5 ` `Client.dump()` criou o diretório e arquivo token sem argumento `mode`, deixando permissões inteiras para o umask do processo:.
```python def dump( self, path: str) -> Nenhum: p = Path(path).expanduser() se p.is_dir() ou não p. name.endswith(".json"): p = p / "garmin_tokens.json" p.parent.mkdir(parentes=True, exist_ok=True) # no mode= p.write_text(self.dumps()) # no permission restriction ``` A carga útil serializada inclui `di_token`, `di_refresh_token` e `di_client_id`. A chamada está na biblioteca central (`Garmin. login(tokenstore=...)` persiste assim), e todos os exemplos de uso enviados por padrão a loja de símbolos para `~/.garminconnect`. Em 'umask' 022 ` as permissões resultantes foram. - diretório de fichas → ` 0 o 755 ` - `garmin_tokens.json` → ` 0 o 644 ` (lindo- o mundo).
Um usuário separado e desprivilegiado na mesma máquina pode ler o arquivo com um simples `open()` — sem privilégios elevados necessários — e extrair o token de atualização. Roubo de credenciais locais / escalada de privilégios em host Linux ou macOS multi- usuário que funcionam sob um umask permissivo. O token de atualização roubado pode ser trocado por tokens de acesso novos através do objetivo OAuth do Garmin, permitindo o acesso contínuo à conta da vítima (dados de saúde/fitness, histórico de atividade, gestão de dispositivos) até que o token seja revogado. Corrigido em ** 0.3.5 ** (commitiu ` 77 a 3837 `). ` dump()` agora cria o diretório como ` 0 o 700 ` e escreve o arquivo token como ` 0 o 600 ` independentemente de umask — usando `os.open(..., O_CREAT.O_WRONLY.O_TRUNC, 0 o 600 )` com `O_NOFOLLOW` onde está disponível, mais um `chmod` defensivo que também aperta um arquivo solto pré- existente:.
```python p.parent.mkdir(modo= 0 o 700, pais=Verdade, exist_ok=Verdade) com contextlib.suppress(OSError): p.parent.chmod( 0 o 700 ) bands = os.O_WRONLY.O_CREAT.O_TRUNC se hasattr(os, "O_NOFOLLOW"): bands.O_NOFOLLOW fd = os.open( p, bands, 0 o 600 ) com os. fdopen( fd, "w", codificando="utf- 8 ") como f: f.write( self.dumps()) com contextlib.suppress(OSError): p.chmod( 0 o 600 ) ``` Verificado em `umask 022 `: pasta ` 0 o 700 `, arquivo ` 0 o 600 `, nenhum grupo/ outro acesso.
Se você não puder atualizar imediatamente, restrinja manualmente a loja de símbolos e mantenha-a somente dono: ````bash chmod 700 ~/.garminconnect chmod 600 ~/.garminconnect/garmin_tokens.json ```. 1. **Atualizar** para `garminconnect >= 0.3.5 `: ```` 'Bash pip install -- upgrade garminconnect `` 2. **Conserta qualquer arquivo token já no disco** — atualização apenas reforça as permissões na gravação * Next*, de modo que um arquivo existente legível pelo mundo permanece exposto até então: ```` bash chmod 600 ~/.garminconnect/garmin_tokens.json # ou removê-lo e logue-se novamente para confeccionar uma loja de símbolos recente ``` 3. **Se o arquivo foi exposto em um hospedeiro compartilhado, trate o token de atualização como comprometido.** Reautenticar (apagar a loja de tokens e logar novamente) para que seja emitido um novo token; considere o token armazenado anteriormente potencialmente lido por outros até que seja rotado.
Reportado por **EQSTLab** através de um aconselhamento de segurança privada. garminconnect agradece- os pela divulgação detalhada e responsável. Registro de aconselhamento: GHSA- wjhr- 76 vg- 2 HVC. Identificadores relacionados: CVE- 2026 - 54447.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 15 T 17: 33: 00.000 Z e lista a sua última modificação como 2026 - 07 - 15 T 17: 33: 00.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N.
Software afetado e informações de versão: PyPI package garminconnect — ECOSISTEM: introduzido 0, corrigido 0.3.5. Classificação e evidência: identificadores de fraqueza CWE- 732. O registro contém 5 suporte de referências nestes tipos: WEB, PACKAGE.