Обнаружил интересный баг работы события 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.
Я думаю, что в первом случае стоит посмотреть в сторону баблинга событий.
ADDED_TO_STAGE не баблится, в том-то и дело. Да и фаза с target и currentTarget одинаковы во всех трех вызовах.
Интересно, что Адобъ ответил?..
самим интересно. баг им в трэкер поставили, они его скрыли в приватный раздел. типа нефиг всем смотреть на секурити дыру.
[...Сколько раз будет вызван обработчик addedToStage для sp0? Я всегда полагал, что один раз. Оказывается, он будет вызван три (!) раза. Это о багах...]
Кстати как невовремя его обнаружил в своей работе… омг.
Это кагбэ странна.
Про ADDED_TO_STAGE – это вполне нормальное поведение. Думаю, у них там в dispatchEvent цикл типа (естественно, на С/С++):
for (var i:Number = 0; i < numListeners; i++)
{
call(…);
}
Соответственно, в процессе работы тела цикла numListeners увеличивается и все происходит как описано.
Про ApplicationDomain – думаю, это нормальное поведение. Где-то в хелпах видел фразу про то, что не надо использовать ApplicationDomain для разграничения прав доступа – он не для того. Для этого, мол, юзайте SecurityDomain.
Неправильное поведение, тем не менее.
Про AppDomain — дело не в разграничении, внимательно прочитайте и поймите, о чем речь.
Мы описали дыру и отправили в Jira, в ответ пришло письмо о том, что описание дыры было перенесено в приватный раздел и они будут разбираться.
Pingback: Записки о Flash » LoaderInfo Vulnerability Fixed?
Подскажите, пожалуйста.
Мне нужно загрузить в мое 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’ми? Как можно исправить?
Спасибо.