О дырах и багах

Обнаружил интересный баг работы события ADDED_TO_STAGE:

This content requires Adobe Flash Player.


Сколько раз будет вызван обработчик addedToStage для sp0? Я всегда полагал, что один раз. Оказывается, он будет вызван три (!) раза. Это о багах.

Теперь о дыре, обнаруженной BlooDHounD-ом вместе со мной. У класса LoaderInfo есть один интересный статический метод getLoaderInfoByDefinition, принимающий в качестве аргумента любой объект и возвращающий объект LoaderInfo. Дело в том, что LoaderInfo, который он возвращает, имеет ссылки на content (document class нашего приложения), а значит на stage и прочие объекты, доступ к которым, вообще говоря, должен быть ограничен. На лицо серьезная дыра, позволяющая обращаться к stage из любого объекта или класса, не говоря уже об ApplicationDomain, причем, независимо от того, в каком домене находится объект, вызывающий данный метод. Простой пример:

This content requires Adobe Flash Player.


Письмо о дыре будет отправлено в Adobe.

9 Responses to О дырах и багах

  1. Я думаю, что в первом случае стоит посмотреть в сторону баблинга событий.

  2. ADDED_TO_STAGE не баблится, в том-то и дело. Да и фаза с target и currentTarget одинаковы во всех трех вызовах.

  3. Интересно, что Адобъ ответил?..

  4. самим интересно. баг им в трэкер поставили, они его скрыли в приватный раздел. типа нефиг всем смотреть на секурити дыру.

  5. [...Сколько раз будет вызван обработчик addedToStage для sp0? Я всегда полагал, что один раз. Оказывается, он будет вызван три (!) раза. Это о багах...]
    Кстати как невовремя его обнаружил в своей работе… омг.
    Это кагбэ странна. :D

  6. Про ADDED_TO_STAGE – это вполне нормальное поведение. Думаю, у них там в dispatchEvent цикл типа (естественно, на С/С++):

    for (var i:Number = 0; i < numListeners; i++)
    {
    call(…);
    }

    Соответственно, в процессе работы тела цикла numListeners увеличивается и все происходит как описано.

    Про ApplicationDomain – думаю, это нормальное поведение. Где-то в хелпах видел фразу про то, что не надо использовать ApplicationDomain для разграничения прав доступа – он не для того. Для этого, мол, юзайте SecurityDomain.

  7. Неправильное поведение, тем не менее.

    Про AppDomain — дело не в разграничении, внимательно прочитайте и поймите, о чем речь.

    Мы описали дыру и отправили в Jira, в ответ пришло письмо о том, что описание дыры было перенесено в приватный раздел и они будут разбираться.

  8. Pingback: Записки о Flash » LoaderInfo Vulnerability Fixed?

  9. Подскажите, пожалуйста.

    Мне нужно загрузить в мое flex-приложение внешний swf, который создан на pureMVC.

    Вот код:
    package {
    import flash.display.*;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class loaderExample extends Sprite {

    private var _loader:Loader = new Loader();

    public function loaderExample( ) {
    this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
    }

    private function addedToStage(event:Event):void
    {
    _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoadComplete);

    var loaderContext:LoaderContext = new LoaderContext(false, new ApplicationDomain());

    _loader.load( new URLRequest( “app.swf” ), loaderContext );
    }

    private function swfLoadComplete(e:Event):void
    {
    addChild(e.currentTarget.content);
    }
    }
    }

    Но вылезает куча ошибок типа:
    Cannot access a property or method of a null object reference.

    Это может быть связано как-то с stage’ми? Как можно исправить?
    Спасибо.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>