Как стать автором
Обновить

История одного бага

Время прочтения 7 мин
Просмотры 8.3K
Системное администрирование *
Буквально вчера мне пришлось разбираться с одним очень тонким и специфичным багом. Баг оказался фичей, которая спотыкалась о другой баг. В ходе изучения проблемы я был вынужден изучить несколько особенностей Debian, угробить 4 часа времени и получить массу опыта.

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

Предыстория

В ходе разворачивания стенда для экспериментов из нескольких идентичных серверов захотелось иметь возможность запускать нужные версии приложения без ручной работы по обновлению кода на куче хостов. Было решено запускать нужные программы с NFS-шары. Приложения были internal use only, одноразовые, причём написанные под конкретную задачу. Шара монтировалась в каталог /opt при загрузке и приложения оттуда запускались с помощью скрипта rc.local. Поскольку речь шла про экспериментальный стенд с очень частым изменением кода, играть в честного разработчика (пакеты, репозиторий, обновления, init.d скрипты) было лениво. Всё происходило под Debian Squeeze.

Шара была прописана в /etc/fstab, запуск нужных тестов — в rc.local. Казалось бы, всё сделано.

… И тут я наткнулся на Мистику. Приложения стартовали раз из пяти, причём версия «кривое приложение» была отметена почти сразу — ровно так же иногда не запускались любые другие исполняемые файлы. Причём, с /opt. Из других каталогов отрабатывали нормально. При этом руками rc.local запускаешь — 100% всё хорошо. При загрузке — успешный запуск раз из пяти, или даже реже.

В начале я не воспринимал эту проблему как серьёзную, и пытался её решить нахрапом. Поскольку проблема проявлялась только для /opt я дописал в rc.local команду ls -a1 /opt >/var/log/ls. Как и предполагалось, в /opt на момент выполнения rc.local было только два файла — точка и две точки. Другими словами, NFS-шара не подмонтировалась. Иногда. А иногда подмонтировалась.

Читать дальше →
Всего голосов 187: ↑172 и ↓15 +157
Комментарии 78

Боремся с race condition в PHP

Время прочтения 4 мин
Просмотры 6.7K
PHP *
Из песочницы
Ошибки типа «Состояние гонки» (race condition) редко встречаются на малонагруженных проектах, а с ростом нагрузки ситуация медленно, но верно меняется. И однажды обычное кеширование данных в файле, например, вот такое:

function getFlagFromFile($filename) {
    if (file_exists($filename)) {
        if (!$this->validate()) { // а не устарел ли файл?
            unlink($filename);
            return false;
        }
        else {
            return file_get_contents($filename);
        }
    }
    return false;
}

выдаёт ошибку в строке unlink(): файл $filename не существует!
Читать дальше →
Всего голосов 46: ↑32 и ↓14 +18
Комментарии 77

Компилируем код из кода для воспроизведения гонки двух процессов

Время прочтения 3 мин
Просмотры 8.1K
Блог компании Content AI Ненормальное программирование *Отладка *
Класс CSharpCodeProvider позволяет программе на C# компилировать код на C#. Обычный вопрос – «зачем». Обычные ответы:
  1. исполнение кода, данного пользователями, как на ideone.com,
  2. «ну мало ли зачем» и
  3. «а это уже отдельный вопрос»

Сегодня мы используем этот класс для удобного воспроизведения гонки двух процессов.
Читать дальше →
Всего голосов 46: ↑31 и ↓15 +16
Комментарии 11

Как я взломал Starbucks для безлимитного кофе

Время прочтения 3 мин
Просмотры 176K
Информационная безопасность *Разработка веб-сайтов *
Это история о том, как я нашел способ нагенерить неограниченное число денег на подарочные карты старбакса, тем самым обеспечить себе пожизненный бесплатный кофе, ну или украсть у них пару миллионов другими способами.

Итак, не так давно мне в голову пришла идея купить 3 карты Старбакса по $5 каждая.

image
Читать дальше →
Всего голосов 240: ↑234 и ↓6 +228
Комментарии 137

Как я однажды взломал онлайн-казино

Время прочтения 7 мин
Просмотры 113K
Информационная безопасность *Спортивное программирование *Разработка веб-сайтов *Тестирование IT-систем *
Вдохновившись рассказом Chikey о том, как он вновь «сломал интернет» Егор прекрати уже ломать все подряд, займись делом каким-нибудь, решил поведать об одной истории с довольно известным за рекой онлайн-казино. Имя этой «организации» не называю, т.к. процентов на 50 уверен, что или совсем не пофиксили, или сделали кривее, чем было до этого.

История очень похожа на взлом Егора, за исключением того, что это не совсем рэйс, вернее, совсем не race condition в чистом его виде. Как оно будет полностью не знаю, я больше практик, чем теоретик. Назовем его «conditional race condition» — хоть и масло масляное, но суть отражает верно.

Как-то вечером, домашние уснули, по ящику одна муть, наши опять проигрывают делать было особенно нечего, на опенсорс решил на сегодня забить, захотелось чего-нибудь сломать. А что ломать (когда Егор уже все сломал), как не банк какой-нибудь или казино (эго, необходимость иногда почувствовать себя крутым парнем, все дела в общем). Это было одно из первых онлайн-казино, которое мне тогда приглянулось в поиске.

Не секрет, что экономят на программистах, тестировщиках и т.д. все или почти все. Я делаю временами аудиты, да и по роду деятельности такого иногда насмотришься, что волосы дыбом. Но тут-то казино! С возможностью вывода (выигранных) вечнозеленых и т.д. Т.е. контора должна вроде соответствовать.

Завел себе аккаунт, и поехали…
Читать дальше →
Всего голосов 132: ↑110 и ↓22 +88
Комментарии 72

Многопоточность (concurrency) в Swift 3. GCD и Dispatch Queues

Время прочтения 28 мин
Просмотры 274K
Программирование *Разработка под iOS *Разработка мобильных приложений *Swift *
Надо сказать, что многопоточность (сoncurrency) в iOS всегда входит в вопросы, задаваемые на интервью разработчикам iOS приложений, а также в число топ ошибок, которые делают программисты при разработке iOS приложений. Поэтому так важно владеть этим инструментом в совершенстве.
Итак, у вас есть приложение, оно работает на main thread (главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI). Как только вы начинаете добавлять к вашему приложению такие «затратные по времени» куски кода, как загрузка данных из сети или обработка изображений на main thread (главном потоке), то работа вашего UI начинает сильно замедляться и даже может привести к полному его «замораживанию».



Как можно изменить архитектуру приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит многопоточность (сoncurrency), которая позволяет одновременно выполнять две или более независимые задачи (tasks): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.
Читать дальше →
Всего голосов 24: ↑23 и ↓1 +22
Комментарии 14

Race condition в веб-приложениях

Время прочтения 7 мин
Просмотры 24K
Информационная безопасность *
Туториал
TL;DR В статье описываются непопулярные трюки с race condition, которые обычно не используют в атаках такого типа. По итогу исследований мы сделали свой фреймворк для атак racepwn.

Вася хочет перевести 100 долларов, которые есть у него на счету, Пете. Он переходит на вкладку переводов, вбивает Петин ник и в поле с количеством средств, которые необходимо перевести — цифру 100. Далее, нажимает на кнопку перевода. Данные кому и сколько отправляются на веб-приложение. Что может происходить внутри? Что необходимо сделать программисту, чтобы все работало корректно?
Читать дальше →
Всего голосов 29: ↑28 и ↓1 +27
Комментарии 10

Почему стоит проверять приложения на устойчивость к race condition

Время прочтения 4 мин
Просмотры 2.6K
Блог компании ITGLOBAL.COM Информационная безопасность *IT-компании
Если ваше приложение или сервис работает с внутренней валютой, следует проверить его на уязвимости типа race condition («состояние гонки» или, если точнее, — «неопределенность параллелизма»). Race condition — это «плавающая ошибка», которую могут эксплуатировать злоумышленники. Суть в том, что благодаря параллельному выполнению кода можно получить доступ к внутренней валюте приложения, манипулировать ею и, при желании, нанести ощутимый финансовый ущерб владельцу сервиса. Недавно мы обнаружили такую проблему у одного из наших клиентов и помогли ее решить.


Читать дальше →
Всего голосов 3: ↑1 и ↓2 -1
Комментарии 7

Борьба с гонками (race conditions) в JavaScript на примере работы с кешем

Время прочтения 3 мин
Просмотры 6.5K
JavaScript *Node.JS *

Рассмотрим следующую задачу. Нам необходимо делать вызовы стороннего API, которые считаются дорогими, и, следовательно, их необходимо кешировать в Redis. Мы используем современный NodeJS (версии 14+), а значит и конструкции async / await.

Напишем сначала класс обертку над вызовом API, где сам вызов будем эмулировать 2-секундным таймаутом.

Читать далее
Всего голосов 13: ↑11 и ↓2 +9
Комментарии 21

Параллельные тесты JUnitPlatform. Как победить в гонке?

Время прочтения 9 мин
Просмотры 2.1K
Блог компании OTUS Тестирование IT-систем *Программирование *Java *

Начиная с версии 5.3 JUnit Platform предоставило возможность параллельного запуска тестов, что может существенно увеличить скорость прохождения тестовых сценариев. Но в то же время, если сценарии используют какие-либо разделяемые ресурсы, общие для всех тестов, без использования механизмов синхронизации можно обнаружить неустойчивое выполнение тестов из-за возможного переключения потоков выполнения во время исполнения тестируемого кода ("состояние гонки"). В этой статье мы рассмотрим как настроить параллельное тестирование и как обнаружить (и преодолеть) потенциальные проблемы доступа к общим ресурсам.

Читать далее
Всего голосов 7: ↑6 и ↓1 +5
Комментарии 2

Как работать с атомарными типами данных в C++

Время прочтения 13 мин
Просмотры 15K
Блог компании МойОфис Программирование *C++ *
✏️ Технотекст 2022

Насколько популярна сегодня тема атомарных данных, настолько же она обширна для одной статьи. Можно подробно останавливаться на разных аспектах атомарности: например, анализировать memory ordering, рассуждать о lock-free алгоритмах с использованием атомиков или исследовать производительность атомиков на разных платформах.

Под катом мы рассмотрим некоторые базовые принципы работы с атомарными типами данных в языке C++. А именно: осветим работу с атомарными данными, основные операции с ними в стандартной библиотеке C++, а также некоторые аспекты использования атомиков с пользовательскими типами данных.

Читать далее
Всего голосов 61: ↑60 и ↓1 +59
Комментарии 11

Как багхантеры ищут уязвимости: лайфхаки и неочевидные нюансы

Время прочтения 7 мин
Просмотры 2.4K
Блог компании Positive Technologies Информационная безопасность *Разработка веб-сайтов *JavaScript *Тестирование веб-сервисов *
Туториал

Багхантинг — очень интересное занятие (по моему скромному мнению 🙂). Никогда не знаешь, какую уязвимость удастся найти сегодня. Каждый белый хакер уникален и имеет собственный стиль. Тяжелым трудом он приобретает необходимые навыки и оттачивает техники поиска уязвимостей определенных классов. В случае успеха приложенные усилия окупаются наградой — крупным денежным вознаграждением.

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

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

Узнать больше
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 0