Кто-то насмотрелся Mr. Robot =)

Мужик взло­мал ком­пью­тер­ную сеть тюрь­мы граф­ства Уоште­но (штат Мичи­ган), что­бы выз­во­лить дру­га.

Как водит­ся — через соци­аль­ный инже­не­ринг, самое дей­ствен­ное сред­ство до сих пор. Пацан явно шёл к успе­ху, но феде­ра­лы зажо­пи­ли 🙂

О винилофильстве и плёнколожстве

Отку­да в циф­ро­вом зву­ке берёт­ся шум? Он берёт­ся из не вполне точ­но­го пред­став­ле­ния ана­ло­го­во­го сиг­на­ла, так как для того, что­бы опи­сать сину­со­и­ду, у нас име­ет­ся конеч­ное коли­че­ство коор­ди­нат по оси Y. В слу­чае с ком­пакт-дис­ка­ми это 65536 воз­мож­ных зна­че­ний, так как у нас есть 16 бит — 15 бит на опи­са­ние уров­ня плюс один бит на знак. 8‑битные зву­ко­вые фай­лы, кста­ти, без­зна­ко­вые (во бар­дак!) Ось Х про­бле­мы не пред­став­ля­ет, в пол­ном соот­вет­ствии с тео­ре­мой Най­к­ви­ста-Шен­но­на-Котель­ни­ко­ва

Зави­си­мость в деци­бе­лах отно­ше­ния сигнал/шум от того, каким коли­че­ством уров­ней опи­сы­ва­ет­ся сиг­нал, линей­ная, и рас­счи­ты­ва­ет­ся как 20log10(2коли­че­ство бит), или при­мер­но 6.02 × коли­че­ство бит.

Стой­кие апо­ло­ге­ты ана­ло­го­вых носи­те­лей напи­ра­ют на то, что, мол на циф­ро­вом носи­те­ле все­го 65536 уров­ней, а на нашем-то тёп­лом лам­по­вом вини­ле (или на маг­нит­ной плён­ке) коли­че­ство уров­ней ана­ло­го­вое, т.е. неогра­ни­чен­ное!!! Ага, ага. А вот хрен вам. С ана­ло­го­во­го носи­те­ля точ­но так же мож­но достать конеч­ное коли­че­ство уров­ней сиг­на­ла, и для хоро­ше­го «доре­во­лю­ци­он­но­го» вини­ла это чис­ло состав­ля­ет при­мер­но 2000 или 11 бит. Это даст пре­дель­ное отно­ше­ние сигнал/шум в рай­оне 70 дБ — что, вооб­ще-то, не так уж пло­хо. Это замет­но луч­ше MP3-шек, напри­мер =))) Толь­ко винил надо хоро­шень­ко помыть-почи­стить, что­бы не было слыш­но пыли — она силь­но пор­тит впе­чат­ле­ние.

В слу­чае с плён­кой уже надо гово­рить более пред­мет­но — тут смот­ря какая плён­ка. Наи­луч­шее каче­ство в домаш­них усло­ви­ях дава­ли кату­шеч­ные маг­ни­то­фо­ны — с них мож­но было тоже достать при­мер­но 11 бит. Кас­се­ты, когда толь­ко появи­лись, были пол­ное и окон­ча­тель­ное гов­но, и дава­ли где-то 6‑битный звук. Это­го было вполне доста­точ­но для при­ме­не­ния в дик­то­фо­нах (для коих, их, соб­ствен­но, и раз­ра­бо­та­ли), но недо­ста­точ­но для каче­ствен­но­го вос­про­из­ве­де­ния музы­ки. Тем не менее, их рас­ту­щая попу­ляр­ность и сопут­ству­ю­щие посто­ян­ные улуч­ше­ния в обла­сти элек­тро­ни­ки при­ве­ли к тому, что посте­пен­но они вышли на уро­вень кату­шеч­ных маг­ни­то­фо­нов, а с вве­де­ни­ем тех­но­ло­гий типа Dolby и про­чих улуч­шай­зе­ров, даже немно­го пре­взо­шли их (кату­шеч­ные маг­ни­то­фо­ны к это­му вре­ме­ни уже, ясен пень, никто не улуч­шал). Но — это при нали­чии хоро­шей кас­сет­ной деки, каче­ствен­ной сту­дий­ной ком­пакт-кас­се­ты, и т.д. А вос­хи­щать­ся ана­ло­го­вым носи­те­лем МК-60, суну­тым в Элек­тро­ни­ку-302 мож­но раз­ве что после тре­тьей бутыл­ки.

Что име­ем с гуся? С гуся име­ем то, что ана­ло­го­вый носи­тель тоже, по сути, циф­ро­вой — коли­че­ство вытас­ки­ва­е­мой с него инфор­ма­ции конеч­но. Это для любо­го носи­те­ля спра­вед­ли­во — даже для 35mm фото­гра­фи­че­ской плён­ки. С неё — в иде­а­ле — мож­но достать 10 мега­пик­се­лей. Повто­рюсь — в иде­а­ле. Со сним­ков на совет­скую ч/б плён­ку сере­ди­ны 1960х годов я вытя­ги­вал при­мер­но 1 мега­пик­сель, не более.

Дорисовал

Таки доде­лал про­грам­ку на Питоне, рису­ю­щую спектр сиг­на­ла и авто­ма­ти­че­ски счи­та­ю­щую КНИ+шум и ОСШ. Попут­но узнал, как водит­ся, мно­го ново­го. За что люб­лю Питон — так это за то, что про­грам­ма зани­ма­ет менее 40 строк. На тех же Сях я бы усрал­ся это рисо­вать. Даже на Шар­пах бы усрал­ся.

Про­грам­ме скарм­ли­ва­ет­ся зву­ко­вой файл с сиг­на­лом часто­той в 1 kHz, сге­не­ри­ро­ван­ный про­грам­мой Adobe Audition (в деви­че­стве Syntrillium CoolEdit). Но мож­но взять и бес­плат­ный Audacity, резуль­тат будет точ­но такой же. Про­грам­ма чита­ет файл, берёт зна­че­ние с наи­боль­шим пиком и даёт ему обо­зна­че­ние в 0 деци­бел. Осталь­ное, соот­вет­ствен­но, отри­ца­тель­ные вели­чи­ны. Под­счи­ты­ва­ет­ся сред­не­квад­ра­тич­ное зна­че­ние все­го, что не сиг­нал, и делит­ся на уро­вень сиг­на­ла. Полу­ча­ет­ся КНИ+шум (THD+N). Потом счи­та­ем ОСШ (отно­ше­ние сигнал/шум, SNR) в деци­бе­лах: 20log10(сиг­нал / шум)

Вот так выгля­дит ана­лиз зву­ко­во­го фай­ла с сиг­на­лом 1 kHz, раз­ре­ше­ни­ем 16-бит, часто­та дис­кре­ти­за­ции — 48 kHz:

Это весь­ма близ­ко к тео­ре­ти­че­ско­му иде­а­лу — в иде­а­ле, раз­ре­ше­ние 16 бит может дать ОСШ в 96.3 dB. Но у меня не иде­ал, так как я исполь­зую чуть менее, чем 16 бит — ибо если гене­ри­ро­вать сину­со­и­ду с уров­нем в 0 dB (т.е. по-мак­си­му­му), то поче­му-то уже лезут нели­ней­ные иска­же­ния. Так что я создаю её с уров­нем в ‑0.1 dB, мини­маль­ным отступ­ле­ни­ем от мак­си­му­ма, кото­рое мне даёт делать Audition. В любом слу­чае, 94 dB — это дохре­на.

КНИ в 2 тысяч­ных про­цен­та это тоже пре­крас­но. Без при­бо­ров это­го никто нико­гда не уви­дит, иска­же­ния начи­на­ют быть слы­ши­мы­ми, когда уже вплот­ную при­бли­жа­ют­ся к 1%, хотя это силь­но зави­сит от того, что имен­но слу­ша­ем: если чистые сину­со­и­ды, то иска­же­ния начи­на­ют быть замет­ны­ми гораз­до рань­ше, а если в каче­стве тесто­во­го мате­ри­а­ла брать аль­бо­мы фиф­ти­сен­тов и про­чих, то там мож­но и 10% иска­же­ний не услы­шать. Что не озна­ча­ет, что аппа­ра­ту­ра, даю­щая КНИ в 0.05%, ничем не луч­ше аппа­ра­ту­ры, даю­щей 0.1% — она луч­ше; про­сто в реаль­но­сти уша­ми это­го ни один живой чело­век не услы­шит.

А теперь — сно­ва пнём фор­мат MP3 🙂 Никто как-то вот не заду­мы­ва­ет­ся о том, что они слу­ша­ют в тыся­че­дол­ла­ро­вых дере­вян­ных науш­ни­ках, под­клю­чён­ных к внеш­ним уси­ли­те­лям клас­са А за семь­сот дол­ла­ров, обе­ща­ю­щим КНИ в 0.00045%

А меж­ду тем это реа­лии MP3 с бит­рей­том в 192 килобита/сек:

А это — 320 килобит/сек:

Получ­ше, конеч­но, чем 192 kbps, но всё рав­но про­се­да­ние каче­ства очень нали­цо — про­ис­хо­дит серьёз­ное ужи­ма­ние дина­ми­че­ско­го диа­па­зо­на (я в кур­се, что ДД и ОСШ это не вполне одно и то же, но они свя­за­ны). На неко­то­ром мате­ри­а­ле (напри­мер, клас­си­че­ская музы­ка, обла­да­ю­щая боль­шим дина­ми­че­ским диа­па­зо­ном) это может быть очень замет­но. На 192 кило­би­тах так это точ­но замет­но, тихая пар­тия скрип­ки сопро­вож­да­ет­ся скре­же­том арте­фак­тов сжа­тия с поте­ря­ми — соб­ствен­но­уш­но, так ска­зать, слы­шал. Даль­ней­шее уве­ли­че­ние бит­рей­та после 320 килобит/с, кста­ти, уже ниче­го не даёт — ОСШ так и оста­ёт­ся в рай­оне 55 деци­бел.

Ещё надо будет попи­нать вини­ло­филь­ство и про­чее плён­ко­ло­же­ство, но это в дру­гой раз 🙂

Изящное решение

Как извест­но, ком­пью­те­ры не могут гене­ри­ро­вать по-насто­я­ще­му слу­чай­ные чис­ла. Они исполь­зу­ют мате­ма­ти­че­скую фор­му­лу, про­из­во­дя какие-то дей­ствия над изна­чаль­ным чис­лом. Фор­му­ла эта — детер­ми­ни­ро­ван­ная, т.е. если взять одно и то же изна­чаль­ное чис­ло два­жды, то на выхо­де будет то же самое. Обыч­но полу­чен­ное таким обра­зом псев­до­слу­чай­ное чис­ло скарм­ли­ва­ет­ся назад в фор­му­лу, цели­ком или как часть изна­чаль­но­го чис­ла.

Напри­мер, вот такая фор­му­ла (сиш­ный син­так­сис): x = (x * 17) % 11

Начи­ная с x = любое нату­раль­ное чис­ло, она будет выда­вать псев­до­слу­чай­ные нату­раль­ные чис­ла от 1 до 10. Но после­до­ва­тель­ность будет все­гда одной и той же — на выхо­де видим 8, зна­чит, сле­ду­ю­щим чис­лом будет 4. Конеч­но, насто­я­щие фор­му­лы для гене­ра­ции псев­до­слу­чай­ных чисел намно­го более слож­ны (напри­мер, хеши­ро­ва­ние SHA256) и очень хоро­шо апрок­си­ми­ру­ют слу­чай­ное рас­пре­де­ле­ние, но всё рав­но рано или позд­но даже они начи­на­ют зацик­ли­вать­ся.

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

Напри­мер, очень попу­ля­рен сбор слу­чай­но­сти от дей­ствий чело­ве­ка. Так, мож­но счи­тать коли­че­ство так­тов про­цес­со­ра меж­ду нажа­ти­я­ми кно­пок на кла­ви­а­ту­ре. Даже самая дис­ци­пли­ни­ро­ван­ная маши­нист­ка не смо­жет повто­рить их один-в-один. При­мер­но так и рабо­та­ет сбор энтро­пии во Фрю­ник­сах — /dev/random счи­та­ет так­ты про­цес­со­ра меж­ду пре­ры­ва­ни­я­ми.

У это­го под­хо­да тоже есть про­бле­мы. У неза­ня­то­го сер­ве­ра, где мало вза­и­мо­дей­ствий, гене­ри­ру­ю­щих пре­ры­ва­ния, про­бле­ма сбо­ра энтро­пии сто­ит доволь­но ост­ро. Я даже более ска­жу — воз­мож­на ата­ка, кото­рая будет под­со­вы­вать это­му сер­ве­ру какую нуж­но «слу­чай­ность», и на этой осно­ве ломать алго­ритм шиф­ро­ва­ния. При­мер­но так рабо­тал недав­ний KRACK для бес­про­вод­ных сетей — где кря­кер застав­лял сеть пере­ис­поль­зо­вать зна­че­ние, кото­рое долж­но быть одно­ра­зо­вым.

Поэто­му для осо­бо важ­ных вещей, где крип­то­стой­кость явля­ет­ся кри­ти­че­ски важ­ным делом, к сбо­ру энтро­пии очень серьёз­ный под­ход. Мой люби­мый метод — под­клю­чён­ный к сер­ве­ру сч0тчик Гей­ге­ра и источ­ник ради­а­ции. Вре­мя меж­ду реги­стра­ци­ей двух иони­зи­ру­ю­щих частиц абсо­лют­но слу­чай­но.

Но есть и не такие ради­каль­ные спо­со­бы. Так, ком­па­ния Cloudflare, зани­ма­ю­ща­я­ся предо­став­ле­ни­ем услуг инфо­без­опас­но­сти, при­ду­ма­ла инте­рес­ную мето­ди­ку с при­ме­не­ни­ем лаво­вых ламп.

Кар­тин­ка из ста­тьи на ZDNet.

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

Чорт возь­ми, изящ­но!

Шутка дня

Пока­зы­ваю пле­мян­ни­ку 3.5‑дюймовую дис­ке­ту.

Реак­ция пле­мян­ни­ка:

–Ух, кру­то! Ты напе­ча­тал на 3D прин­те­ре кноп­ку сохра­не­ния!

А в самом деле, если поду­мать, то дис­ке­та на кноп­ке гово­рит о запи­си дан­ных толь­ко стар­пё­рам вро­де нас.

Богат октябрь на баги.…

Раз:

Всем, исполь­зу­ю­щим бес­про­вод­ные сети с шиф­ро­ва­ни­ем WPA2, мож­но начи­нать боять­ся. Суще­ству­ет кибе­р­ата­ка, поз­во­ля­ю­щая рас­шиф­ро­вать и спу­фить пере­да­ва­е­мые дан­ные через повтор­ное исполь­зо­ва­ние одно­ра­зо­во­го кода (nonce):

https://www.krackattacks.com/

При этом, что харак­тер­но, пароль WPA2 узнать по-преж­не­му невоз­мож­но.

Два:

Все крип­то­гра­фи­че­ские сопро­цес­со­ры Infineon гене­ри­ру­ют пло­хо защи­щён­ные клю­чи несим­мет­рич­но­го шиф­ро­ва­ния RSA:

http://www.tomshardware.com/news/infineon-tpm-insecure-rsa-keys,35668.html

Если у вас есть ноут­бук Lenovo, HP, Fujitsu, Asus и вы исполь­зу­е­те крип­то­гра­фи­че­ский сопро­цес­сор — може­те начи­нать боять­ся.

Дав­нень­ко таких кру­тых багов не было…

Русские рубят русских

Как пока­за­ло вскры­тие, в 2015 году рос­сий­ские хаке­ры укра­ли сек­рет­ные доку­мен­ты АНБ США, взло­мав рос­сий­ский же анти­ви­рус Кас­пер­ско­го:

https://www.forbes.com/sites/leemathews/2017/10/05/guess-which-software-russian-hackers-targeted-to-steal-nsa-secrets/#5295f671170c

Улыб­ну­ло.

Разу­ме­ет­ся, сама кон­то­ра Кас­пер­ско­го к это­му ника­ко­го отно­ше­ния не име­ла, и нико­му не помо­га­ла. Конеч­но-конеч­но.

Юникс Кунг-Фу

За что мы любим Юник­со­по­доб­ные ОС? Ну, за вся­кое, но не в послед­нюю оче­редь за их отлич­ные команд­ные стро­ки. Конеч­но, мож­но писать скрип­ты или даже неболь­шие про­грам­ки на Пер­ле али Питоне, но если надо быст­ро что-то авто­ма­ти­зи­ро­вать, то луч­ше все­го писать какой-нибудь one-liner типа:

cat file | grep something | sed ‘s/thing/otherthing/’ | awk ‑F «|» ‘{print $1}’ | sort | uniq | wc ‑l

И всё тут пре­крас­но, но здесь совер­шен­но отсут­ству­ет услов­ное ветв­ле­ние — а это ино­гда полез­но.

Напри­мер, мож­но ска­зать вот так:

cd directory; rm ‑rf *

Что будет, если cd directory обло­мит­ся, пото­му что этой дирек­то­рии нет? Нач­нёт выпол­нять­ся rm ‑rf в ТЕКУЩЕЙ дирек­то­рии — что может иметь ката­стро­фи­че­ские послед­ствия.

Как это­го избе­жать? Очень про­сто. Надо ска­зать вот так:

cd directory && rm ‑rf *

В дан­ном слу­чае rm ‑rf выпол­нит­ся ТОЛЬКО если cd directory будет успеш­но выпол­нен.

Рабо­та­ет это очень про­сто — если понять, что дан­ное выра­же­ние пред­став­ля­ет собой не боль­ше, чем усло­вие с Сиш­ным син­так­си­сом. && — это опе­ра­тор AND. Любая коман­да при завер­ше­нии рабо­ты выда­ёт код воз­вра­та (exit status). Если коман­да завер­ши­лась успеш­но, воз­вра­ща­ет­ся код 0, он же явля­ет­ся TRUE. Опе­ра­тор && под­ра­зу­ме­ва­ет что ОБЕ части усло­вия долж­ны воз­вра­щать TRUE, поэто­му если пер­вое усло­вие вер­ну­ло TRUE, надо про­ве­рять вто­рое. Если же пер­вое вер­ну­ло FALSE, то нет смыс­ла про­ве­рять вто­рое (прин­цип мини­ма­ли­за­ции про­вер­ки усло­вий https://en.wikipedia.org/wiki/Short-circuit_evaluation).

Соот­вет­ствен­но, мож­но вывер­нуть это наизнан­ку, если исполь­зо­вать опе­ра­тор || (сиречь OR) меж­ду коман­да­ми. В таком слу­чае вто­рая часть выра­же­ния будет выпол­не­на толь­ко в том слу­чае, если пер­вая вер­нёт FALSE — ибо в соот­вет­ствии с прин­ци­пом мини­ма­ли­за­ции нет смыс­ла про­ве­рять вто­рую часть усло­вия, где усло­вия объ­еде­ни­ны через OR — ибо пер­вая уже вер­ну­ла TRUE.

Напри­мер, вот так:

cd test|| mkdir test

Дирек­то­рия test будет созда­на толь­ко в том слу­чае, если её нет (cd вер­нёт ошиб­ку).

Так­же мож­но объ­еди­нять усло­вия, исполь­зуя тот же Сиш­ный син­так­сис.

(cd directory && rm ‑rf *) || echo «Cannot delete files»

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

Дан­ные коман­ды рабо­та­ют в bash и C‑shell. BSD-шный sh не про­ве­рял, но думаю, что там тоже будет рабо­тать.

Ответка

В ответ на бан анти­ви­ру­са Кас­пер­ско­го на ком­пью­те­рах, при­над­ле­жа­щих МО США (https://experimenter.org/2017/06/29/kaspersky_banned_in_dod/) рос­сий­ские зако­но­да­те­ли пред­ло­жи­ли послать всё нерос­сий­ское анти­ви­рус­ное ПО в том же направ­ле­нии?

«Ко вто­ро­му квар­та­лу 2019 года чинов­ни­ки наме­ре­ны зако­но­да­тель­но обес­пе­чить пред­уста­нов­ку оте­че­ствен­ных анти­ви­рус­ных про­грамм на все пер­со­наль­ные ком­пью­те­ры, вво­зи­мые и созда­ва­е­мые на тер­ри­то­рии Евразий­ско­го эко­но­ми­че­ско­го сою­за.»

Подроб­нее на РБК:
http://www.rbc.ru/technology_and_media/03/07/2017/5958d9c29a7947e1a748af1a

Не вполне понят­но, чем всё это закон­чит­ся. «Обес­пе­чить пред­уста­нов­ку» не зна­чит ведь запре­та поль­зо­ва­ни­ем дру­гих анти­ви­ру­сов?

А то как-то слиш­ком наг­ло полу­ча­ет­ся. «Слу­шай­те свои «Вален­ки» и не выпенд­ри­вай­тесь». И пле­вать, что анти­вирь Кас­пер­ско­го напи­сан настоль­ко кри­во, что раз в два дня акку­рат­ней­шим обра­зом вешал мне комп так, что тре­мя паль­ца­ми он не под­ни­мал­ся. Что там ещё есть? Дох­тур Веб? Ниче­го про него не ска­жу — не поль­зо­вал­ся.

Или это про­сто в Кас­пер­ском занес­ли куда надо? Что­бы обес­пе­чить про­да­жи сво­е­го кри­во­го про­дук­та?

И вооб­ще, это какие-то полу­ме­ры. Вин­до­уз-то не заба­ни­ли. Как не заба­ни­ли Ворд, Эксель, и проч.