Resumo das Proteções
| Camada | Proteção | Status |
|---|---|---|
| Autenticação | Comparação de tokens em tempo constante (crypto/subtle) | Ativo |
| Shell | Quoting POSIX para prevenir injeção em argumentos de shell | Ativo |
| Editores | Validação de EDITOR contra allowlist de editores conhecidos | Ativo |
| Comandos | 50+ padrões regex para detecção de comandos perigosos | Ativo |
| Policies | Matching com word-boundary para evitar escalação de permissões | Ativo |
| gRPC | Reflection desabilitado por padrão (oculta schema do serviço) | Ativo |
| Binários | Resolução de stty via exec.LookPath (evita injeção via PATH) | Ativo |
| Containers | read-only filesystem, no-new-privileges, drop ALL capabilities | Ativo |
| Kubernetes | RBAC namespace-scoped por padrão, SecurityContext restritivo | Ativo |
| Rede | TLS opcional com warning quando desabilitado | Ativo |
Autenticação do Servidor gRPC
Token Bearer com Comparação em Tempo Constante
O servidor gRPC usa autenticação via Bearer token no headerauthorization de cada request. A comparação do token utiliza crypto/subtle.ConstantTimeCompare, que previne ataques de timing — um atacante não consegue inferir caracteres corretos medindo o tempo de resposta.
- Via flag
- Via variável de ambiente
O endpoint
/Health é sempre acessível sem autenticação para permitir health checks de load balancers e orquestradores.TLS (Opcional)
O TLS é totalmente opcional. Em ambiente de desenvolvimento local, você pode rodar sem TLS sem problemas. Para produção, recomendamos fortemente habilitar TLS:- Produção (com TLS)
- Desenvolvimento (sem TLS)
Proteção contra Injeção de Shell
ShellQuote — Quoting POSIX Seguro
Todos os pontos do código onde valores dinâmicos são interpolados em comandos shell utilizam a funçãoutils.ShellQuote(), que aplica quoting POSIX com aspas simples:
- Injeção via aspas:
'; rm -rf /; echo ' - Substituição de comandos:
$(malicious)ou`malicious` - Expansão de variáveis:
$HOME,${PATH} - Pipe/redirecionamento:
| cat /etc/passwd,> /etc/crontab
Pontos Protegidos
| Arquivo | Contexto |
|---|---|
cli/agent_mode.go | Dry-run echo de comandos (simulação) |
cli/cli.go | Source do arquivo de configuração do shell (~/.bashrc, etc.) |
cli/agent/command_executor.go | Source do arquivo de configuração do shell (execução interativa) |
Resolução de Binários via LookPath
O bináriostty (usado para restaurar o terminal) é resolvido uma única vez no startup via exec.LookPath("stty"), retornando o caminho absoluto. Isso evita que um atacante coloque um stty malicioso no PATH.
Validação do EDITOR
Quando o usuário edita comandos no modo agente, a variávelEDITOR é validada contra uma allowlist de editores conhecidos:
Validação de Comandos
50+ Padrões de Detecção
OCommandValidator analisa cada comando sugerido pela IA antes da execução, verificando contra mais de 50 padrões regex que cobrem:
| Categoria | Exemplos |
|---|---|
| Destruição de dados | rm -rf /, dd if=, mkfs, drop database |
| Execução remota | curl | bash, wget | sh, base64 | bash |
| Injeção de código | python -c, perl -e, ruby -e, node -e, php -r, eval |
| Substituição de comandos | $(curl ...), `wget ...` |
| Substituição de processos | <(cmd), >(cmd) |
| Escalação de privilégios | sudo, chmod 777 /, chown -R / |
| Manipulação de rede | nc -l, iptables -F, /dev/tcp/ |
| Kernel | insmod, modprobe, rmmod, sysctl -w |
| Evasão | ${IFS;cmd}, VAR=x; bash, export PATH= |
Denylist Customizada
Adicione seus próprios padrões via variável de ambiente:Controle de sudo
Governança do Modo Coder (Policy Manager)
Matching com Word Boundary
O sistema de policies usa matching com word boundary para prevenir escalação de permissões por prefixo. Exemplo:| Regra | Comando | Resultado |
|---|---|---|
@coder read = allow | @coder read file.txt | Permitido |
@coder read = allow | @coder readlink /tmp | Bloqueado (ask) |
@coder read --file /etc = deny | @coder read --file /etc/passwd | Bloqueado (deny) |
/, =, etc.) e não a continuação de uma palavra (letra, dígito, -, _). Isso garante que read não case com readlink.
Regras Padrão
Os comandos de leitura são permitidos por padrão:Segurança do Servidor gRPC
gRPC Reflection (Desabilitado por Padrão)
O gRPC reflection expoe o schema completo do serviço, permitindo que ferramentas comogrpcurl e grpcui descubram e chamem todos os RPCs. Em produção, isso pode facilitar reconhecimento por atacantes.
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_GRPC_REFLECTION | Habilita gRPC reflection (true/false) | false |
Interceptors de Segurança
Todas as requests passam por uma cadeia de interceptors:Verificação de Versão
O ChatCLI verifica automaticamente se há uma versão mais recente no GitHub. Para desabilitar (ex: ambientes air-gapped ou CI/CD):| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_DISABLE_VERSION_CHECK | Desabilita a verificação automática de versão (true/false) | false |
Segurança de Containers (Docker)
Odocker-compose.yml do projeto inclui as seguintes medidas de hardening:
O que cada medida faz
| Medida | Proteção |
|---|---|
read_only: true | Impede que malware grave arquivos no filesystem do container |
tmpfs | Fornece diretório /tmp em memória com tamanho limitado |
no-new-privileges | Impede que processos filhos ganhem mais privilégios que o pai |
| Resource limits | Previne consumo excessivo de CPU/memória (DoS) |
Segurança no Kubernetes (Helm)
Pod SecurityContext
O Helm chart define um SecurityContext restritivo por padrão:RBAC Namespace-Scoped (Padrão)
Por padrão, o chart cria Role e RoleBinding (namespace-scoped) em vez de ClusterRole. Isso garante que o ChatCLI só tenha acesso ao namespace onde está deployado.clusterWide:
tmpfs Automático
Quando
securityContext.readOnlyRootFilesystem está true, o chart automaticamente monta um volume emptyDir em /tmp (limitado a 100Mi) para que a aplicação possa gravar arquivos temporários.Variáveis de Ambiente de Segurança
Resumo de todas as variáveis relacionadas a segurança:| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_SERVER_TOKEN | Token de autenticação do servidor gRPC | "" (sem auth) |
CHATCLI_SERVER_TLS_CERT | Certificado TLS do servidor | "" |
CHATCLI_SERVER_TLS_KEY | Chave TLS do servidor | "" |
CHATCLI_GRPC_REFLECTION | Habilita gRPC reflection | false |
CHATCLI_DISABLE_VERSION_CHECK | Desabilita verificação de versão | false |
CHATCLI_AGENT_ALLOW_SUDO | Permite sudo no modo agente | false |
CHATCLI_AGENT_DENYLIST | Padrões regex adicionais para bloquear (; separados) | "" |
CHATCLI_AGENT_CMD_TIMEOUT | Timeout de execução por comando | 10m |
Criptografia de Credenciais
As credenciais OAuth são armazenadas com criptografia AES-256-GCM em~/.chatcli/auth-profiles.json. A chave de criptografia é gerada automaticamente e salva em ~/.chatcli/.auth-key com permissão 0600 (somente o dono pode ler).
| Arquivo | Permissão | Conteúdo |
|---|---|---|
~/.chatcli/auth-profiles.json | 0600 | Credenciais OAuth criptografadas |
~/.chatcli/.auth-key | 0600 | Chave AES-256-GCM |
~/.chatcli/coder_policy.json | 0600 | Regras de policy do Coder |
Boas Práticas para Produção
Mantenha gRPC reflection desabilitado
Não defina
CHATCLI_GRPC_REFLECTION=true em produção. Use apenas para debugging local.Use RBAC namespace-scoped
Mantenha
rbac.clusterWide: false (padrão) a menos que precise monitorar múltiplos namespaces.Próximo Passo
Governança do Modo Coder
Regras de policy para controlar o que o Coder pode executar.
Configurar o servidor
Deploy e configuração do servidor gRPC.
Deploy com Docker e Helm
Guia completo de deploy containerizado.
Referência de configuração
Todas as variáveis de ambiente disponíveis.