JTC — Just-in-Time Technology Consulting

Quando o | deixa de ser OR: PowerShell, paradigmas e segurança

Jéfferson Tales Canalli · 02 de novembro de 2026

Nas últimas semanas venho reproduzindo, em VMs (máquinas virtuais) locais, alguns laboratórios de Segurança da Informação. Em um deles apareceu este comando:

Get-MpComputerStatus | Select-Object AntivirusEnabled, RealTimeProtectionEnabled

Anos de linguagens convencionais me fizeram ler o | como OR. Não é. E, para entender o porquê, vale voltar um pouco no tempo.

Um pouco de história

No início dos anos 2000, administrar Windows era, basicamente, clicar. O Unix já tinha um shell maduro, mas suas ferramentas trocavam texto entre si, e o Windows era construído sobre APIs e objetos (COM, WMI, .NET). Ferramentas baseadas em texto não encaixavam.

Em 2002, Jeffrey Snover publicou o Monad Manifesto, propondo um shell em que os comandos trocassem objetos, não texto. O projeto Monad virou o Windows PowerShell 1.0 em 2006, passou a vir instalado por padrão a partir do Windows 7 e, em 2016, tornou-se open source e multiplataforma.

O paradigma por trás do |

O PowerShell é multiparadigma: imperativo, orientado a objetos e com traços funcionais. Mas o pipeline segue a programação orientada a fluxo de dados (dataflow), materializada no estilo arquitetural pipes and filters.

Em linguagens como C, Java ou C#, o | é um operador: recebe dois valores e devolve um resultado. No PowerShell, é um conector: liga a saída de um comando à entrada do próximo. Em vez de aninhar chamadas, como g(f(x)), você encadeia etapas: f | g. E o que trafega são objetos .NET, com tipo e propriedades, processados um a um.

Onde entra a segurança

A consequência prática do Manifesto foi que tudo o que se faz pela interface gráfica passou a poder ser feito pela linha de comando.

Para administração, isso é automação. Para um atacante, é o cenário ideal: uma ferramenta assinada pela Microsoft, presente em todo Windows, com acesso a .NET, WMI e às APIs do sistema. É a base da técnica conhecida como Living off the Land: usar o que já existe na máquina em vez de levar um malware que o antivírus detectaria.

O comando do início ilustra bem: em uma linha, um invasor descobre se o Defender está ativo. Não à toa, o MITRE ATT&CK cataloga o PowerShell como técnica própria (T1059.001), presente em reconhecimento, execução em memória, comandos ofuscados com -EncodedCommand e movimentação lateral.

Do lado defensivo, a resposta veio com o tempo: Script Block Logging (evento 4104), AMSI para inspecionar scripts antes da execução e Constrained Language Mode. E um lembrete importante: Execution Policy não é barreira de segurança.

Entender o paradigma de uma ferramenta não é só curiosidade acadêmica. Quem lê um pipeline como fluxo de objetos entende o que um script está fazendo, e, em segurança, entender é o primeiro passo para detectar.

Este artigo foi originalmente publicado no LinkedIn. Ver publicação original