Segurança – Quebrando senhas de projetos VBA do Microsoft Office

Essa é uma informação um pouco perigosa, devo admitir. Ela compromete uma série de desenvolvedores de aplicativos baseados em VBA, principalmente no contexto de produto.

Mas como considero isso mais uma “falha” do que um “macete”, publicarei aqui a informação para registro e possíveis providências.

O lado bom

Os desenvolvedores VBA recorrem geralmente à proteção de seus projetos pelo mecanismo de proteção padrão oferecido pelo editor. Clicando com o botão direito sobre o projeto, selecione o opção VBAProject Properties (Propriedades do Projeto VBA):

Quebrando senha VBA

A seguinte janela será mostrada após a seleção da aba Protection (Proteção):

Quebrando senha VBA

Até aqui é o tradicional. Basta informar a senha nos dois campos e travar o projeto para visualização (lock project for viewing) que teremos nosso projeto VBA bloqueado para visualização e edição na próxima vez em que o arquivo for aberto.

O lado mau

Qualquer veterano na linguagem VBA sabe que existem uma série de programas que “quebram” as senhas destes projetos. Na verdade eles a sobrescrevem de alguma forma. O resultado é que os projetos, mesmo protegidos por senha ficam vulneráveis.

Geralmente estes softwares usam de artimanhas que vão desde a força bruta (tentativa e erro) ou eles entram mesmo no âmago do arquivo mexem no que não devem, substituindo assim a o dado devido.

Esses softwares são pagos na maioria das vezes, o que pelo menos caracteriza um pouco de profissionalismo por parte de seus fabricantes.

Concordo que em alguns casos existe o esquecimento por parte do autor, mas diria que este são a minoria. Geralmente alguém que tem conhecimento em VBA suficiente para construir um projeto que precisa ser protegido por senha, costuma ser organizado com este tipo de coisa. Temos uma outra situação onde empresas geralmente sofrem com funcionários de má fé que vão embora e largam arquivos bloqueados.

Estes são os únicos casos em que vejo necessidade da existência deste tipo de aplicativo, pois trata-se de cuidar da propriedade intectual do proprietário do código fonte.

Tirando isso, o resto pode ser caracterizado como violação de propriedade.

Bom, posto isso, vem aí a má notícia.

Quebrando o projeto VBA

É um pouco assustador, mas vamos lá.

Para ter acesso ao código de um projeto VBA, é fácil e barato. Basta baixar o Open Office neste endereço:

http://www.broffice.org/download

Para quem não sabe, o Open Office é uma suíte de aplicativos de escritório concorrente do Microsoft Office, assim como o Star Office. Não vou discutir as capacidades do Open Office, além da importante característica que ele possui de também ter disponível um suíte de programação muito semelhante ao VBA, também baseada no Visual Basic, capaz de construir aplicações da mesma forma.

Quando você abre um arquivo do Excel ou Word no aplicativos respectivos no Open Office (Calc e Writer), você tem acesso a todo o conteúdo do arquivo da mesma forma, bem como a todo o projeto VBA, incluindo módulos e formulários.

Muito bem, isso tudo é muito bom pois significa uma compatibilidade quase que universal entre arquivos e aplicativos. Com isso não seria necessário conversões na hora de trocar arquivos com outros sistemas.

O problema é que o Open Office abre o projeto em VBA, mesmo que ele esteja protegido por senha.

isso dá a qualquer um acesso completo a todo o código do projeto.

Não há como demonstrar isso aqui, mas para testar:

  • crie um novo arquivo no Excel ou Word
  • abra o VBA
  • adicione alguns módulos e formulários
  • adicione alguns controles a estes formulários e alguns códigos simples
  • depois disso, proteja o projeto com senha e bloqueie-o para visualização (como mostrado acima)
  • salve e feche o arquivo
  • abra-o novamente no Microsoft Office para certificar-se de que o projeto está mesmo bloqueado para visualização
  • após certificar-se, abra o Open Office Calc para abrir o arquivo de Excel ou o Open Office Calc para o abrir o arquivo do Word
  • através do menu ferramentas, abra a tela de macros e selecione um objeto do projeto VBA e clique em editar para visualizar o código

Seguindo estes passos fica provado o fato do acesso extremamente facilitado ao projeto VBA através de um software livre e gratuito.

Conclusões e comentários

Contra a tecnologia não há nada que se possa fazer. Pelo menos com aquilo que veio da tecnologia.

Não dá para saber de quem é a culpa, se é que há algum culpado nesta história.

Da Microsoft por não promover um esquema de segurança mais eficaz?

Da fundação Open Office por não respeitar o esquema de segurança promovido pelo Microsoft Office?

Eu tenho minha opinião. Fica aqui o protesto pelo fato e o agradecimento a blogosfera por permitir descobrir e divulgar a informação.

Abraços

Tomás

Web – Falha em WordPress permitiria redefinir senhas

Fonte: Yahoo Notícias

Os criadores da popular ferramenta de blogs WordPress recomendaram que todos os usuários de sua ferramenta baixem e instalem a nova atualização do sistema, 2.6.2.

Segundo o site heise Security, todas as versões anteriores, incluindo a 2.6.1, traziam um erro que permitia que, em sites com registro aberto, criar um usuário que sobrescrevesse a senha de outro usuário já existente baseado em um valor aleatório.

Além da confusão, o problema poderia se tornar mais grave graças a uma falha do método aleatório usado pelo sistema, que permitiria prever as senhas geradas aleatoriamente e assim descobrir as novas credenciais de um usuário com privilégios elevados, por exemplo.

Os desenvolvedores do WordPress garantiram que o ataque é de alto nível de dificuldade, mas por causa do risco uma atualização foi rapidamente preparada, noticiou o site ZDNet, acrescentando que o erro é um problema do PHP, a linguagem na qual o WordPress foi escrita, e outras aplicações podem estar vulneráveis.

A nova versão pode ser baixada no endereço wordpress.org e usuários do serviço gratuito WordPress.com não precisam se preocupar com instalação.

Web – MSN volta a falhar nesta quinta

Fonte: INFO

Usuários do MSN voltam a enfrentar dificuldades de login. Falha ocorre pelo 2º dia seguido.

O comunicador mais popular do país enfrenta, pelo segundo dia seguido, instabilidade de acesso. Segundo Priscyla Alves, gerente de Windows da Microsoft Brasil, a empresa vem recebendo notificações de usuários que alegam dificuldades para trocar mensagens.

“Nesse momento, a Microsoft está trabalhando para solucionar a questão o mais breve possível. Assim que o serviço estiver normalizado, nós avisaremos”, diz Priscyla.

Quem consegue se logar no comunicador, também chamado de Windows Live Messenger, pode ter a conexão subitamente interrompida. O problema foi registrado também por usuários de outros países do mundo.

A falha que afeta o MSN nesta quarta/quinta-feira é a segunda do ano. Em 23 de fevereiro, um problema cuja causa não foi revelada, também afetou o acesso ao mensageiro

VBA – Ordenando Arrays e Listas

Uma funcionalidade não nativa do VBA é a ordenação, seja lá ela qual for.

Ela comumente é necessária em Arrays e controles de lista, como ListBox e ComboBox. Métodos de ordenação existem aos montes. Neste caso, usarei o QuickSort, escrito pelo camarada Frederik do http://users.skynet.be/am044448/Programmeren/. O código abaixo faz a ordenação de um Array passado por parâmetro.

Private Sub QuickSort(strArray() As String, intBottom As Integer, intTop As Integer)
    Dim strPivot As String, strTemp As String
 
    Dim intBottomTemp As Integer, intTopTemp As Integer
    intBottomTemp = intBottom
 
    intTopTemp = intTop
    strPivot = strArray((intBottom + intTop) \ 2)
    While (intBottomTemp <= intTopTemp)
        While (strArray(intBottomTemp) < strPivot And intBottomTemp < intTop)
 
            intBottomTemp = intBottomTemp + 1
 
        Wend
        While (strPivot < strArray(intTopTemp) And intTopTemp > intBottom)
 
            intTopTemp = intTopTemp - 1
 
        Wend
        If intBottomTemp < intTopTemp Then
 
            strTemp = strArray(intBottomTemp)
 
            strArray(intBottomTemp) = strArray(intTopTemp)
 
            strArray(intTopTemp) = strTemp
 
        End If
        If intBottomTemp <= intTopTemp Then
 
            intBottomTemp = intBottomTemp + 1
 
            intTopTemp = intTopTemp - 1
 
        End If
    Wend
    'faz a chamada recursiva a si própria até que lista esteja preenchida
 
    If (intBottom < intTopTemp) Then QuickSort strArray, intBottom, intTopTemp
 
    If (intBottomTemp < intTop) Then QuickSort strArray, intBottomTemp, intTop
End Sub

A função não tem um retorno, mas como um array passado por parâmetro para um função é sempre por referência, após a execução desta seu Array estará ordenado em ordem crescente.

Para testar o funcionamento da função, crie um userForm no VBA. Coloque nele um ListBox e um CommandButton, sem se preocupar com alterar seus nomes. Coloque no código do Form a função QuickSort mostrada acima, mais o código abaixo.

Private Sub CommandButton1_Click()
    Dim MyArray(12) As String
    Dim i As Long
 
    'caso não haja itens na lista, não é necessário fazer ordenação
    If ListBox1.ListCount &lt;= 1 Then Exit Sub
    'alimenta o array
    For i = 0 To ListBox1.ListCount - 1
        MyArray(i) = ListBox1.List(i, 0)
    Next i
 
    'ordena o array
    QuickSort MyArray, LBound(MyArray), UBound(MyArray)
    'limpa o listbox
    ListBox1.Clear
    'usa o array ordenado para preencher o listbox
    For i = 1 To UBound(MyArray)
        ListBox1.AddItem MyArray(i)
    Next i
End Sub
Private Sub UserForm_Initialize()
'preenche o listbox com os meses do ano
    For i = 1 To 12
        ListBox1.AddItem MonthName(i, False)
    Next
End Sub

Ao executar o form da primeira vez, pode-se ver que o ListBox é preenchido com os meses do ano através da função MontName.

ordena_listbox_vba
Listbox Carregado com os meses

O código colocado no evento click do botão cria um array de string de tamanho 12, preenche o array com a lista de valores presente no listbox, ordena o array através da função QuickSort e re-preenche o listbox.

ListBox Ordenado
ListBox Ordenado

Uma forma bem simples de fazer ordenação em listas sempre precisar ficar re-pensando no código sempre que precisar.

<< Download do Arquivo >>

Abraços

Tomás