Encontrando
                                  falhas em
                                  aplicações web
                                  baseadas em flash

                                  Wagner Elias
                                  Gerente de Pesquisa e Desenvolvimento
                                  Conviso IT Security




sexta-feira, 14 de maio de 2010
Tópicos
                      • Um pouco sobre flash
                      • Vulnerabilidades
                      • Como fazer direito
                      • Conclusões



sexta-feira, 14 de maio de 2010
Um pouco sobre Flash
sexta-feira, 14 de maio de 2010
Quem desenvolve em flash?
                      • A maioria das aplicações
                              desenvolvidas em flash são:
                            • Peças publicitárias
                                  desenvolvidas por
                                  agências de propaganda
                            • Interferências visuais
                                  criadas por designers



sexta-feira, 14 de maio de 2010
O que eles esquecem?
                      • Flash é Client-Side e pode ser decompilado
                              apresentando o fonte em ActionScript




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
Flash in Client-Side
                         Computador                Server


                            Flash Player




sexta-feira, 14 de maio de 2010
filetype:swf
                      •       Milhares de telas de login com
                              usuário e senha em Client-Side
                            •     filetype:swf inurl:login OR
                                  inurl:secure OR inurl:admin

                      •       Milhares de arquivos
                              crossdomain.xml sem
                              controles de segurança
                            •     filetype:xml inurl:crossdomain



sexta-feira, 14 de maio de 2010
Vulnerabilidades
sexta-feira, 14 de maio de 2010
Information Leakage
                      • Como o swf roda na máquina do usuário,
                              qualquer informação, segredo no código
                              está disponível para qualquer um que
                              decompilar o arquivo swf




sexta-feira, 14 de maio de 2010
Flash Decompile


                                  AS Compila e gera SWF   Text   SWF decompila gera AS


                                       CS3 / MTASC                   SWFScan / Flare




DEMO


sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;

                                  if (_root.userinput3 != null ) {
                                      _root.loadMovie(_root.userinput3);
                                  }
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;

                                  if (_root.userinput3 != null ) {
                                      _root.loadMovie(_root.userinput3);
                                  }
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);     XSS
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;

                                  if (_root.userinput3 != null ) {
                                      _root.loadMovie(_root.userinput3);
                                  }
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);     XSS
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;

                                  if (_root.userinput3 != null ) {
                                      _root.loadMovie(_root.userinput3);
                                  }
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);     XSS
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;   XSS
                                  if (_root.userinput3 != null ) {
                                      _root.loadMovie(_root.userinput3);
                                  }
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);     XSS
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;   XSS
                                  if (_root.userinput3 != null ) {
                                      _root.loadMovie(_root.userinput3);
                                  }
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Cross Site Scripting (XSS)
               • Assim como qualquer aplicação o flash também
                       precisa ter seus inputs tratados
                      class VulnerableMovie {
                          static var app : VulnerableMovie;
                          function VulnerableMovie() {
                              _root.createTextField("tf",0,100,100,640,480);

                                  if (_root.userinput1 != null) {
                                      getURL(_root.userinput1);     XSS
                                  }

                                  _root.tf.html = true; // default is safely false
                                  _root.tf.htmlText = "Hello " + _root.userinput2;   XSS
                                  if (_root.userinput3 != null ) {

                                  }
                                      _root.loadMovie(_root.userinput3);
                                                                              XSS
                             }
                             static function main(mc) {
DEMO                             app = new VulnerableMovie();
                             }
                      }

sexta-feira, 14 de maio de 2010
Crossdomain
               • Por padrão o Flash Player (a partir da versão 7)
                       implementa um SandBox
                     • Apenas com um crossdomain.xml é possível
                             comunicar com outras aplicações




sexta-feira, 14 de maio de 2010
Crossdomain Abuse
                     • O problema é inserir o crossdomain.xml
                             usando o wildcard padrão e sem determinar
                             quais endereços podem se comunicar




DEMO


sexta-feira, 14 de maio de 2010
Crossdomain Abuse
                     • O problema é inserir o crossdomain.xml
                             usando o wildcard padrão e sem determinar
                             quais endereços podem se comunicar




DEMO


sexta-feira, 14 de maio de 2010
Crossdomain Abuse
                     • O problema é inserir o crossdomain.xml
                             usando o wildcard padrão e sem determinar
                             quais endereços podem se comunicar



                                              Permite que qualquer um acesse o conteúdo




DEMO


sexta-feira, 14 de maio de 2010
Como fazer direito
sexta-feira, 14 de maio de 2010
Flash Security Facts

               • Não insira informações sensiveis em flash
               • Valide todos os inputs
               • Defina quais domínios podem acessar o
                       conteúdo no crossdomain.xml
               • Se for inevitável o flash, criptografar o
                       ActionScript (SWF Encrypt)


sexta-feira, 14 de maio de 2010
Conclusões
sexta-feira, 14 de maio de 2010
Conclusões
               • A Adobe adora a Apple
               • ActionScript é uma linguagem de programação
                       e deve ser tratada como tal
               • É preciso definir e implementar controles de
                       segurança como em qualquer aplicação web




sexta-feira, 14 de maio de 2010
Web 2.0?




                                  Perguntas?
sexta-feira, 14 de maio de 2010

Encontrando falhas em aplicações web baseadas em flash

  • 1.
    Encontrando falhas em aplicações web baseadas em flash Wagner Elias Gerente de Pesquisa e Desenvolvimento Conviso IT Security sexta-feira, 14 de maio de 2010
  • 2.
    Tópicos • Um pouco sobre flash • Vulnerabilidades • Como fazer direito • Conclusões sexta-feira, 14 de maio de 2010
  • 3.
    Um pouco sobreFlash sexta-feira, 14 de maio de 2010
  • 4.
    Quem desenvolve emflash? • A maioria das aplicações desenvolvidas em flash são: • Peças publicitárias desenvolvidas por agências de propaganda • Interferências visuais criadas por designers sexta-feira, 14 de maio de 2010
  • 5.
    O que elesesquecem? • Flash é Client-Side e pode ser decompilado apresentando o fonte em ActionScript sexta-feira, 14 de maio de 2010
  • 6.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 7.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 8.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 9.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 10.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 11.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 12.
    Flash in Client-Side Computador Server Flash Player sexta-feira, 14 de maio de 2010
  • 13.
    filetype:swf • Milhares de telas de login com usuário e senha em Client-Side • filetype:swf inurl:login OR inurl:secure OR inurl:admin • Milhares de arquivos crossdomain.xml sem controles de segurança • filetype:xml inurl:crossdomain sexta-feira, 14 de maio de 2010
  • 14.
  • 15.
    Information Leakage • Como o swf roda na máquina do usuário, qualquer informação, segredo no código está disponível para qualquer um que decompilar o arquivo swf sexta-feira, 14 de maio de 2010
  • 16.
    Flash Decompile AS Compila e gera SWF Text SWF decompila gera AS CS3 / MTASC SWFScan / Flare DEMO sexta-feira, 14 de maio de 2010
  • 17.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; if (_root.userinput3 != null ) { _root.loadMovie(_root.userinput3); } } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 18.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; if (_root.userinput3 != null ) { _root.loadMovie(_root.userinput3); } } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 19.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); XSS } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; if (_root.userinput3 != null ) { _root.loadMovie(_root.userinput3); } } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 20.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); XSS } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; if (_root.userinput3 != null ) { _root.loadMovie(_root.userinput3); } } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 21.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); XSS } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; XSS if (_root.userinput3 != null ) { _root.loadMovie(_root.userinput3); } } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 22.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); XSS } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; XSS if (_root.userinput3 != null ) { _root.loadMovie(_root.userinput3); } } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 23.
    Cross Site Scripting(XSS) • Assim como qualquer aplicação o flash também precisa ter seus inputs tratados class VulnerableMovie { static var app : VulnerableMovie; function VulnerableMovie() { _root.createTextField("tf",0,100,100,640,480); if (_root.userinput1 != null) { getURL(_root.userinput1); XSS } _root.tf.html = true; // default is safely false _root.tf.htmlText = "Hello " + _root.userinput2; XSS if (_root.userinput3 != null ) { } _root.loadMovie(_root.userinput3); XSS } static function main(mc) { DEMO app = new VulnerableMovie(); } } sexta-feira, 14 de maio de 2010
  • 24.
    Crossdomain • Por padrão o Flash Player (a partir da versão 7) implementa um SandBox • Apenas com um crossdomain.xml é possível comunicar com outras aplicações sexta-feira, 14 de maio de 2010
  • 25.
    Crossdomain Abuse • O problema é inserir o crossdomain.xml usando o wildcard padrão e sem determinar quais endereços podem se comunicar DEMO sexta-feira, 14 de maio de 2010
  • 26.
    Crossdomain Abuse • O problema é inserir o crossdomain.xml usando o wildcard padrão e sem determinar quais endereços podem se comunicar DEMO sexta-feira, 14 de maio de 2010
  • 27.
    Crossdomain Abuse • O problema é inserir o crossdomain.xml usando o wildcard padrão e sem determinar quais endereços podem se comunicar Permite que qualquer um acesse o conteúdo DEMO sexta-feira, 14 de maio de 2010
  • 28.
  • 29.
    Flash Security Facts • Não insira informações sensiveis em flash • Valide todos os inputs • Defina quais domínios podem acessar o conteúdo no crossdomain.xml • Se for inevitável o flash, criptografar o ActionScript (SWF Encrypt) sexta-feira, 14 de maio de 2010
  • 30.
  • 31.
    Conclusões • A Adobe adora a Apple • ActionScript é uma linguagem de programação e deve ser tratada como tal • É preciso definir e implementar controles de segurança como em qualquer aplicação web sexta-feira, 14 de maio de 2010
  • 32.
    Web 2.0? Perguntas? sexta-feira, 14 de maio de 2010