2 pontos por GN⁺ 2025-01-03 | 2 comentários | Compartilhar no WhatsApp
  • O iTerm2 3.5.11 é uma versão compilada em 2 de janeiro de 2025, e a atualização imediata é recomendada devido a uma correção crítica de segurança relacionada à integração com SSH
  • O escopo de impacto inclui usuários das versões 3.5.6 a 3.5.10 que usaram o recurso de integração com SSH e de todas as versões beta posteriores à 3.5.6
  • Quando o bug ocorre, a entrada e a saída são registradas em /tmp/framer.txt no host remoto, e outros usuários do mesmo host remoto podem ler esse arquivo
  • As condições são o uso de it2ssh ou, em um perfil, Command estar definido como "SSH" e "SSH Integration" estar selecionado, além de haver Python 3.7 ou superior no caminho de busca padrão do host remoto
  • Os usuários devem atualizar para a 3.5.11 e, em seguida, excluir /tmp/framer.txt nos hosts remotos afetados

Escopo de impacto e condições de ocorrência

  • O iTerm2 3.5.11 é uma versão que inclui uma correção crítica de segurança, e a atualização imediata é recomendada
  • As versões potencialmente afetadas são as seguintes, quando o recurso de integração com SSH foi usado
    • 3.5.6
    • 3.5.7
    • 3.5.8
    • 3.5.9
    • 3.5.10
    • Todas as versões beta posteriores à 3.5.6
  • O bug faz com que o recurso de integração com SSH registre a entrada e a saída em /tmp/framer.txt no host remoto
    • Esse arquivo pode ser lido por outros usuários do host remoto
  • O problema ocorre quando todas as condições a seguir são verdadeiras
    • O comando it2ssh é usado
    • Ou, em Settings > Profiles > General, o menu pop-up Command está definido como "SSH", e "SSH Integration" está selecionado na caixa de diálogo de configurações de SSH
      • As configurações "Login Shell", "Command" e "Custom Command" não estão incluídas nessa condição
    • O host remoto tem Python 3.7 ou superior instalado no caminho de busca padrão

Atualização e verificação

  • Os usuários devem atualizar imediatamente para o iTerm2 3.5.11
  • Nos hosts remotos afetados, o arquivo /tmp/framer.txt deve ser excluído
  • O código que grava arquivos de log na integração com SSH foi removido e não será lançado novamente em uma versão pública
  • O valor SHA-256 do arquivo zip é o seguinte
    • 655e32b4a9466104f1b0d8847e852515bc332bdf434801762e01b9625caa43e2
  • Para verificar o arquivo zip, é possível usar https://keybase.io/verify

2 comentários

 
xguru 2025-01-03

Fiquei surpreso ao conferir, e vi que a minha versão é 3.4.3. Como ultimamente não tenho usado muito o terminal, nem dei muita atenção a isso, então também não tenho atualizado direito.

 
GN⁺ 2025-01-03
Opiniões no Hacker News
  • Parece um caso de depuração com print() que foi parar em produção
    https://github.com/gnachman/iTerm2/commit/63ec2bb0b95078a97a...
    https://github.com/gnachman/iTerm2/blame/5db0f74bf647f6d53ea...

    • O código em si não é estranho; a estrutura só grava no arquivo quando o modo verbose está ativado
      O commit que desligou o modo verbose foi este, imediatamente antes de remover todo o log do framer: https://github.com/gnachman/iTerm2/commit/014ba7ec40fc790f65...
      O commit que ativou o modo VERBOSE foi este: https://github.com/gnachman/iTerm2/commit/5db0f74bf647f6d53e...
      Provavelmente, durante a implementação ou depuração, alguém mudou para VERBOSE=1 e esqueceu de voltar para VERBOSE=0 antes do commit
    • No desenvolvimento em TypeScript, transformamos console.log em erro de lint para que não possa ser mesclado, e, às vezes, quando há uma necessidade legítima, usamos console.info
      Depuração com print em si é aceitável e há momentos para usá-la, mas é bom ter salvaguardas para não deixá-la para trás por engano. É um erro realmente fácil de cometer
    • Isso ficou lá por 3 anos?
  • É bem sério que, por causa de um bug no recurso SSH integration, entradas e saídas tenham sido registradas no arquivo /tmp/framer.txt do host remoto, e que esse arquivo pudesse ser lido por outros usuários do host remoto
    Esse tipo de arquivo pode ter ficado até em máquinas às quais você se conectou por SSH no passado, mas às quais agora não tem mais permissão de acesso

    • As duas condições precisam ser satisfeitas para ocorrer
      1. Você usou o comando it2ssh, ou, em Settings > Profiles > General, o menu pop-up Command estava definido como "SSH" e "SSH Integration" estava marcado. "Login Shell", "Command" e "Custom Command" não se aplicam
      2. O host remoto precisa ter Python 3.7 ou superior instalado no caminho de busca padrão
    • Este bug provavelmente quase nunca ocorre. É um recurso muito específico, a ponto de 99% das pessoas aqui nunca terem ouvido falar dele nem usado
      Ainda assim, se você é do tipo que usa ssh como comando padrão do terminal em vez de bash ou zsh, há uma boa chance de também usar muitos recursos incomuns em outros apps, então deveria se preocupar não só com o iTerm, mas com outras superfícies de ataque também
  • Uso o iTerm2 há muito tempo, tanto para trabalho quanto para uso pessoal, e pretendo continuar usando e doar novamente, como já fiz antes

  • Sempre solto um pequeno suspiro quando vejo uma frase como “lamento profundamente este erro e tomarei medidas para garantir que isso nunca aconteça novamente”
    O ponto central é que medidas são essas, e nem sei bem o que deveria ser feito para impedir que algo assim aconteça de novo. Talvez seja possível criar uma ferramenta automatizada que execute todos os recursos, capture chamadas de sistema e verifique se eles não abrem nem escrevem arquivos, mas, em um app com GUI, isso parece tão difícil que imagino que nem tentariam. Medidas menores do que isso parecem insuficientes para garantir que não volte a acontecer

    • Uma quantidade enorme de dinheiro foi investida em fuzzing do Chrome/Chromium, mas ainda assim dezenas de vulnerabilidades graves são encontradas todos os anos. O mesmo vale para outros produtos importantes
      Na prática, parece difícil para um programador fazer muito melhor do que isso; nesse caso, é injusto colocar toda a responsabilidade sobre essa única pessoa
    • Pelo fato de o aviso de segurança ser curto, parece que o autor quis divulgar os detalhes relacionados ao incidente o mais rápido possível
      Mas não acho que a brevidade signifique que ele não entenda a gravidade do erro. Ainda assim, espero que depois saia um post de blog aprofundado tratando desse tipo de detalhe de acompanhamento
    • Essa frase é a coisa menos ruim que se pode dizer e, ao mesmo tempo, também a melhor coisa a dizer
      Seria pior não pedir desculpas, e também seria pior não dizer que tomará medidas para evitar recorrência. Seria até estranho se todas as medidas já estivessem prontas agora. Primeiro é preciso A) corrigir o bug, B) distribuir a versão corrigida, C) comunicar o bug e a distribuição da correção, e depois D) fazer a análise post-mortem; misturar tudo isso pareceria uma abordagem com o processo desorganizado
      Também seria estranho afirmar que é possível impedir todos os bugs ou toda escrita acidental em arquivos. É impossível provar que nunca se escreve em arquivos
      Um bom ponto de partida é remover o log de SSH, como de fato foi feito, e investigar formas automatizadas de verificar acesso a arquivos. No desenvolvimento para macOS há muitas ferramentas muito à frente das ferramentas comuns do ecossistema, então talvez existam métodos como uma documentação técnica dos anos 1990 para especificar um NSArray de caminhos permitidos de acesso, ou a integração dtrace embutida no Instruments. Rodar isso no CI e garantir cobertura de testes é algo próximo do melhor que dá para fazer
      A questão parece ser se você lê “tomarei medidas para garantir que isso nunca aconteça novamente” como “tomarei medidas até poder garantir, absoluta e 100% eternamente, que isso nunca voltará a acontecer”. Para pessoas jovens e influenciáveis, eu diria: este post de blog é excelente, e há muito pouco que poderia ser feito melhor aqui
    • Se você é engenheiro de software, esse tipo de coisa continua acontecendo, independentemente da escala. No fim, você vai cometer erros
      A medida possível é usar isso como lição para ficar mais cuidadoso ao entrar nesse caminho
    • Em outro comentário mencionaram a abordagem de usar um linter para impedir merge de PRs que contenham console.log, e acho que eu adotaria exatamente esse caminho
      Impedir que um estado inválido exista é um princípio bastante útil
  • Em geral deve ser questão de preferência pessoal, mas em 2025 existe algum motivo realmente convincente para usar iTerm2 em vez do Terminal padrão do macOS?
    Recebi muitas recomendações, mas fiquei cauteloso por causa de preocupações de segurança e privacidade, como esse bug de SSH

    • Para mim, o recurso essencial é Edit > Selection Respects Soft Boundaries. Ele permite copiar texto de uma janela definida dentro do terminal, por exemplo dentro de um painel dividido do tmux ou do emacs, e o iTerm reconhece coisas como o caractere de pipe como limites da janela
      Outro ponto é que, se eu fechar uma aba ou janela por engano e apertar ⌘z em poucos segundos, a janela reaparece como se não tivesse sido fechada
      E o contraste mínimo de cores também é bom. Se o tema de cores do terminal e o tema de cores do programa em execução se combinarem mal e ficarem ilegíveis, o iTerm consegue detectar isso e sobrescrever automaticamente com cores de maior contraste
      Mas esses são apenas os meus recursos essenciais. O iTerm é um monstro inchado, como o Word, com milhares de recursos. Nem todo mundo precisa de todos eles, e também não há consenso sobre quais recursos são necessários
    • Eu ia perguntar se o Terminal nunca teve problemas de segurança, mas tentei encontrar a página de notas de versão e não consegui
      Também procurei por terminal em várias notas de versão do macOS, mas não encontrei nada. Alguém sabe onde essas informações são divulgadas? Elas não são divulgadas?
      [1] https://developer.apple.com/documentation/macos-release-note...
      [2] https://support.apple.com/en-us/120283
      [3] https://support.apple.com/en-in/109035
      [4] https://support.apple.com/en-us/106337
    • O único motivo pelo qual mudei para o iTerm2 foi porque eu queria que as cores do terminal mudassem ao me conectar a outros hosts via SSH
      Eu queria que ficasse azul ao fazer SSH para a máquina da empresa e roxo ao fazer SSH para a máquina de casa. Tentei fazer isso no terminal padrão, mas havia problemas confusos dependendo de como a sessão terminava, e as pessoas recomendaram o iTerm2 dizendo que ele resolvia isso. Pelo menos no meu caso, resolveu mesmo
    • Uso o Kitty(https://sw.kovidgoyal.net/kitty) como principal há alguns anos, e ele é excelente junto com o tmux
      Também ouvi muita gente dizer que https://ghostty.org/ é bom, mas ainda não conferi
      Além disso, li a pergunta errado como “quais são as alternativas”
    • No fim, depende de há quanto tempo você usa macOS e de quais pequenos hábitos e peculiaridades acabou adquirindo
      Para mim, só o fato de poder usar um modo de tela cheia diferente da tela cheia nativa do macOS já vale a pena. Mas talvez existam só umas sete pessoas no mundo que considerem isso importante
  • Tenho muita empatia pelo desenvolvedor que mantém o iTerm com relativamente pouco dinheiro. Ele já recebeu críticas demais por causa da integração com IA
    Ao mesmo tempo, agora estou bem preocupado se posso continuar usando o iTerm
    Ao acessar ambientes de HPC, às vezes você só tem permissão de acesso por um curto período, precisa limpar os dados manualmente depois do uso e espera que não haja vazamento de dados. Se eu tivesse usado a integração SSH do iTerm no último ano enquanto trabalhava com dados de pesquisa contendo informações pessoais, eu teria ficado em uma situação complicada. Talvez tivesse de mandar um e-mail constrangedor para o administrador pedindo para verificar se havia logs e se eram meus, e depois anunciar publicamente que houve vazamento de dados
    Uso alguns recursos avançados, mas agora me pergunto se ainda posso usar algo além das funções básicas. Nesse caso, talvez seja melhor usar outro terminal. Ainda não encontrei um terminal multiplataforma que pareça tão nativo no MacOS quanto o iTerm, incluindo o Ghostty

    • Recomendo fortemente o wezterm
    • Há motivo para trocar para outro terminal por causa de um único problema em todo esse longo tempo de existência?
      É parecido com abandonar um carro porque um pneu furou uma vez. Considerando as vantagens e os recursos que ele oferece, o iTerm talvez ainda seja a melhor escolha
    • Se você é pesquisador, manter um ambiente de computação seguro não é uma responsabilidade individual
      Se um indivíduo precisa verificar pessoalmente a segurança de todo o sistema e de todo software que usa, então essa organização não tem segurança
      Um administrador de sistemas competente e com conhecimento de segurança consegue configurar facilmente para que os arquivos criados via SSH não tenham, por padrão, permissões de leitura para todos. Também pode colocar outros mecanismos de bloqueio que isolem completamente os arquivos dos usuários, e até desativar totalmente pastas globais graváveis como /tmp/
      Se alguém reclamar que você usou software com falha de segurança, você deve perguntar por que o sistema deles é tão vulnerável em termos de segurança
    • Uso o Prompt, da Panic
  • Alguns anos atrás, relatei um problema em que o iTerm2 vazava histórico de buscas sensíveis para o arquivo de configuração, e o problema foi corrigido rapidamente
    Mas ainda hoje é possível encontrar pessoas vazando sem querer o histórico de buscas em repositórios públicos de dotfiles
    [1]: https://gitlab.com/gnachman/iterm2/-/issues/8491
    [2]: https://github.com/search?q=NoSyncSearchHistory+path%3A*.pli...

  • A sugestão de “simplesmente não use o iTerm2” não faz muito sentido para mim
    Esse tipo de problema pode acontecer em qualquer projeto, e trocar de ferramenta não oferece uma proteção significativa. Pelo contrário, muitas vezes as práticas de segurança ficam mais fortes depois de incidentes assim. É parecido com aquela piada antiga sobre demitir o engenheiro que cometeu o erro, em que o gerente responde: “Por que eu o demitiria? Ele acabou de aprender uma lição inesquecível”
    Olhando para o histórico do iTerm2, não parece que ele tenha tido problemas de segurança críticos com frequência, nem que vá repetir o mesmo erro. Se isso se repetir, aí dá para reavaliar
    O app Terminal do macOS é mais simples e recebe atualizações com menos frequência, então pode parecer de menor risco. Mas ele é de código fechado, então não dá para auditá-lo, e isso também tem seus próprios riscos. No fim, toda ferramenta tem trade-offs, e a escolha precisa equilibrar os recursos necessários com os riscos potenciais

    • Você acha que práticas de desenvolvimento influenciam a taxa de ocorrência de bugs de segurança? E acha que o histórico passado reflete essa taxa de ocorrência de bugs de segurança?
      Muita gente tem essas duas crenças como razoáveis. É uma visão bem mais sutil do que dizer “todo projeto pode ter bugs”. Esse tipo de visão em preto e branco não ajuda muito na avaliação de risco
  • O iTerm2 ficou cada vez mais complexo e inchado demais, e também parece ter problemas de segurança demais
    Faz tempo que não procuro um novo emulador de terminal no macOS, mas parece que chegou a hora
    O GNU Screen também parece estar parado, então talvez seja hora de fazer a migração para o tmux, algo que eu vinha adiando

    • Testei o Ghostty recentemente e, desde então, migrei completamente do iTerm2. Ele é familiar e, ao mesmo tempo, bem polido
    • “Complexo demais” e “inchado” são expressões genéricas, então seria bom explicar de forma mais específica
      Pessoalmente, não sinto que o iTerm2 se encaixe em nenhuma das duas
    • Uso bastante a integração com tmux do iTerm2. Ela faz a rolagem com o mouse funcionar de forma natural nas janelas do tmux
      Ainda não vi outro terminal oferecer suporte a tmux no mesmo nível
    • Uso o Terminal.app desde a versão 10.0 e nunca senti necessidade de substituí-lo
      O que falta no Terminal que faria outro app melhorar o uso diário?
    • Você ainda usa GNU Screen? Tanto o GNU Screen quanto o tmux já tiveram problemas de segurança no passado, mas o GNU Screen foi pior, e por isso eu troquei
      Vale a pena dar uma olhada no Zellij, um multiplexador de terminal feito em Rust. Gosto especialmente de como ele facilita descobrir os atalhos de teclado. É quase o que eu sempre sonhei para uma TUI
  • Isso se aplica só à integração com SSH, e não ao caso de simplesmente executar "ssh" no iTerm?
    Não encontrei o arquivo /tmp/framer.txt nos hosts em que me conectei usando ssh comum

    • Pelas notas de lançamento, parece que isso só se aplica quando a integração SSH embutida é usada e quando o servidor tem uma versão relativamente recente do Python
      Esta última condição provavelmente é verdadeira na maioria das distribuições corporativas. Por exemplo, o RHEL 9 vem com Python 3.9 instalado por padrão