Ad-social Bot

Smmok Bot

Vkserfing Bot

Vkstorm Bot

Vktarget Bot

Все программы

Запись опубликована: 23.02.2018

Привет, меня зовут Pavel Germanika

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


 

Может ли человек, проживая в унылом бесперспективном городе, чего-то добиться, имея под рукой лишь старый ноутбук и интернет? Можно ли без всяких офисов, начальных капиталов построить компанию, приносящую неплохую прибыль? Ответ на этот вопрос вы сможете узнать в моем блоге. Я Pavel Germanika, добро пожаловать!

Всю свою жизнь я прожил в мечтах. Это было какое-то полугипнотическое состояние. Я любил гулять по улицам или лежать на диване, представляя себя успешным человеком. Будь то бизнесменом, известным футболистом, ученым, которому вручают нобелевскую премию и прочими персонажами. Любые дела я всегда откладывал на потом. Все жизненные перспективы я старался не замечать. Думаю, многие люди со мной схожи.

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

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

Мой Блог — это реалити-шоу обычного заурядного парня, который пытается добиться успеха с полного нуля. Никакого начального капитала, никаких знакомств, никаких особых способностей. Только идеи, анализ и компьютер. Я хочу быть максимально открытым и делиться с вами всеми своими мыслями и результатами работы.

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

Любой из вас может связаться со мной. Я рад каждому! Пишите на мой Telegram.

Метки: ,





Запись опубликована: 19.01.2019

[Из песочницы] Собственное исследование, что нам могут рассказать открытые источники?

image

Вдохновившись статьей Group-IB о масштабной хакерской атаке на банки и предприятия от лица госучреждений решил разузнать про RTM немного больше.

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

Исходные данные из поста EditorGIB:

  1. 11 сентября 2018 года — начало массовой вредоносной рассылки

    «…в общей сложности с сентября до начала декабря хакеры отправили 11 073 писем с 2 900 различных электронных адресов, подделанных под госучреждения. Обнаружено около 900 различных доменов, связанных с адресами отправителей».

  2. По содержанию писем представлена информация:

    «…в качестве темы письма указывается «Отправка на четверг», «Служебная записка», «Оплата август-сентябрь», «Копии документов» и др.)».

  3. Информация о вредоносном коде – «Троян RTM».
  4. Сетевые идентификаторы: домен namecha.in и IP-адреса: 188.165.200.156, 185.190.82.182, 5.135.183.146, 151.80.147.153, 109.69.8.34.
  5. Согласно выводам аналитика от Group-IB:

    «Для получения IP-адреса «C&C» сервера происходит обращение к сайту «namecha.in».

Проверим, что знают сервисы hybrid-analysis.com, virustotal.com о namecha.in. Для расследования буду использовать продукт с названием Lampyre — позиционирующий себя как «Data analysis tool for everyone», по моим впечатлениям, продукт является результатом композиции i2, Maltego и видимо разработчики вдохновлялись Palantir-ом.

Исполнение запросов Hybridanalysis search, и Virustotal search дает следующий результат:

image

Видно, что, имена файлов, отправленных когда-то на проверку в сервис Hybrid-analysis, схожи с именами из отчета аналитиков Group-IB.

Исполним 2 запроса Hybridanalysis report by hash с входными данными report ids, и hashes из результата предыдущего отчета. Результаты запросов отправим на схему с первоначальным графом и очистим граф от объектов, в которых пока нет необходимости. В результате получаем:

image

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

Визуализируем результат от запроса к Virustotal

image

image

Подведем промежуточный итог по объектам и результатам:

  1. Hybrid-analysis:
    • 4 домена: stat-counter-3-1.bit, stat-counter-4-1.bit, stat-counter-6-1.bit, vpnrooter.bit;
    • 19 ip-адресов: 151.80.147.153, 94.156.189.28, 185.177.59.35, 185.203.117.161, 88.221.214.41, 195.123.225.58, 5.135.183.146, 91.92.136.232, 212.73.150.183, 204.85.32.91, 169.239.129.25, 216.58.213.132, 109.69.8.34, 185.190.82.182, 188.165.200.156, 216.58.213.131, 5.149.255.199, 104.28.17.33, 104.28.16.33
  2. Virsutotal:

Итак, возникают вопросы:

  1. Что за доменная зона *.bit;
  2. Что за urls к namecha.in и какие ответы.

Видно, что доменное имя stat-counter-3-1.bit из данных Hybrid-analysis похоже на url namecha.in/name/d/stat-counter-3-1 из Virustotal.

Изначально, я не имел представления о namecha.in, однако, в общих чертах выяснилось: существует проект Namecoin, еще одно использование технологий «blockchain».

Namecoin — основанная на технологии Bitcoin система хранения произвольных комбинаций вида «имя-значение», наиболее известным применением которой является система альтернативных корневых DNS-серверов.

Ресурс Namecha.in — альтернативный namecoin block explorer.

То есть по namecha.in/name/d/mail-ru-stat-counter-cdn вернется информация следующего содержания (сокращенно):

Status Active
Expires after block 461917 (30918 blocks to go)
Last update 2018-11-16 10:35:22 (block 425917)
Registered since 2018-06-13 19:44:47 (block 402893)
Current value {«ip»: [«185.203.117.161»]}

Operations

Date/time Operation Value
2018-11-16 10:35:22 OP_NAME_UPDATE {«ip»:[«185.203.117.161»]}
2018-07-30 14:05:46 OP_NAME_UPDATE {«ip»:[«195.123.226.143»]}
2018-07-18 11:35:27 OP_NAME_UPDATE {«ip»:[«185.82.219.79»]}
2018-06-13 19:44:47 OP_NAME_FIRSTUPDATE {«ip»:[«195.123.217.232»]}

Как видно, возвращается информация об ip-адресах указанного доменного имени (mail-ru-stat-counter-cdn.bit), в том числе с ретроспективой.

Кстати, проверить разрешение доменного имени в зоне bit возможно через nslookup с сервера 91.217.137.44 (взято с bitname.ru).

С помощью поиска на namecha.in, удалось найти следующие домены в зоне *.bit, которые по типу генерации и созданию, вполне возможно имеют родственное происхождение:

  1. namecha.in/name/d/ya-ru-stat-counter, ya-ru-stat-counter.bit;
  2. namecha.in/name/d/ya-ru-stat-counter-cdn, ya-ru-stat-counter-cdn.bit;
  3. namecha.in/name/d/stat-counter-3-1, stat-counter-3-1.bit;
  4. namecha.in/name/d/stat-counter-3-2, stat-counter-3-2.bit;
  5. namecha.in/name/d/stat-counter-4-1, stat-counter-4-1.bit;
  6. namecha.in/name/d/stat-counter-4-2, stat-counter-4-2.bit;
  7. namecha.in/name/d/stat-counter-6-1, stat-counter-6-1.bit;
  8. namecha.in/name/d/stat-counter-6-2, stat-counter-6-2.bit;
  9. namecha.in/name/d/mail-ru-stat, mail-ru-stat.bit;
  10. namecha.in/name/d/mail-ru-stat-cdn, mail-ru-stat-cdn.bit;
  11. namecha.in/name/d/mail-ru-stat-counter, mail-ru-stat-counter.bit;
  12. namecha.in/name/d/mail-ru-stat-counter-cdn, mail-ru-stat-counter-cdn.bit

Поэтому, с помощью запросов к namecha.in я собрал всю информацию по перечисленным доменам в зоне *.bit, сохранил информацию в csv файл с полями Datetime, IP, URL, Domain, импортировал в Lampyre и создал шаблон для графа.

Urls намекают на причастность к известным компаниям, однако тут возникают вопросы:

  • их структурная идентичность — полагаю, что если бы их действительно придумывали разные люди, то и их структура была бы разной.
  • IP адреса, в которые резолвятся эти записи, не имеют никакого отношения к этим двум компаниям, а принадлежат зарубежным хостерам. У обеих компаний есть свои ЦОДы за пределами РФ и вряд ли они бы стали размещать какие-то сервисы на хостингах. Но даже если бы и стали, то скорее всего добавили бы обратные ДНС записи к этим адресам.
  • Создается впечатление, что эти urls придумывали для того, чтобы замаскироваться под всем известные, российские сервисы.

image

В виде графа выглядит так (вершины с url – удалены с графа)

image

По графу можно увидеть, что инфраструктура из доменов *.bit готовилась с апреля 2018 года и продолжает использоваться по настоящее время. «Случайность» доменов и ip-адресов, как мне кажется — исключена.

Итак, отталкиваясь в самом начале от факта обращения трояна RTM к namecha.in, расследование пришло к некой устойчивой инфраструктуре — сети из ip-адресов, которые однозначно могут быть частью компании по распространению вредоносного программного обеспечения.

Всего выявлено IP-адресов: из Hybrid-analysis — 19, со схемы с namecha.in и доменами *.bit — 31.

Всего 44 уникальных IP-адресов:

102.165.37.97, 104.28.16.33, 104.28.17.33, 109.69.8.34, 109.94.110.11, 109.94.110.12, 149.202.30.7, 151.80.147.153, 169.239.129.25, 173.242.124.143, 185.141.61.246, 185.141.62.222, 185.141.62.82, 185.177.59.35, 185.190.82.182, 185.203.117.161, 185.203.119.69, 185.205.210.184, 185.206.146.194, 185.82.219.79, 188.165.200.156, 193.37.212.134, 193.37.212.147, 193.37.212.183, 193.37.212.185, 195.123.217.232, 195.123.217.242, 195.123.225.58, 195.123.226.143, 195.123.245.184, 204.85.32.91, 212.73.150.183, 216.58.213.131, 216.58.213.132, 5.135.183.146, 5.149.255.199, 5.149.255.217, 54.38.49.245, 88.221.214.41, 91.92.136.133, 91.92.136.232, 94.156.144.112, 94.156.189.28, 94.156.35.107

А теперь, вернёмся к статье аналитика из Group-IB, к входным данным в наше исследование:

«Далее «RTM» пытается установить соединение с «C&C» сервером (были обнаружены следующие адреса: 188.165.200.156, 185.190.82.182, 5.135.183.146, 151.80.147.153, 109.69.8.34). Для получения IP-адреса «C&C» сервера происходит обращение к сайту «namecha.in».

Все эти 5 IP адресов нами были обнаружены уже по результатам первого запроса к Hybrid-analysis с аргументом namecha.in, и можно было бы заниматься только ими, но я продолжил дальше, чтобы постараться обнаружить другие IP адреса. В итоге – для анализа и исследования на предмет взаимосвязей доступны 44 IP адреса.

Уже есть понимание, что известные 5 IP-адресов должны быть как-то по каким-то признакам связаны, возможно в сети (на графе) будет очевидна связь и с другими 39 адресами, или они все будут образовывать интересную структуру.

Опять русские хакеры?

Очевидно, что и целями атак были российские предприятия, и файлы назывались по-русски, и отправка осуществлялась с различных электронных адресов, подделанных под госучреждения. Будут ли еще признаки русского следа? Что еще можно узнать по найденным выше IP – адресам?

Проверим принадлежность IP адресов к странам и получим такой результат: United States, Bulgaria, France, Austria, Canada, Czechia, Netherlands, Poland, South Africa, Spain.

image

image

Проверим были ли среди найденных 44 IP-адресов узлы сети Tor, лишним осуществить такую проверку не будет.

image

Обратим внимание, что IP 151.80.147.153 – с 2015 года регулярный узел сети TOR, nickname: DarkOVH, email: julles.reneau@post.com, – этот IP проходит по отчету аналитика Group-IB и отчетам Hybrid-analysis.

Проверим качали ли (раздавали) с этих IP-адресов torrents.

image

image

А вот сейчас, с моей стороны будет маленький трюк – так как статья готовилась в два подхода, то я уже обоснованно предполагаю, что 188.165.200.156 может использоваться кем-то русскоговорящим, но сейчас из скриншота и таблицы — это совсем не очевидно. Ранее, в первом подходе к написанию статьи, результат от исполнения поиска по torrents содержал наряду с другими такую информацию:

30.11.2018 14:36:00	30.11.2018 14:36:00	188.165.200.156	      	Пастырь (сезон 1) Preacher (2016).WEB-DL.720p.LostFilm                     	1976	cd46d4168ee44f31fbefce4303e24cbbda2d2cafe8283fa30363bc6148455d1ac1130edad0c9237934c05bf6c2d857c7

То есть пользователь(ли) за этим IP – адресом понимает русскую речь? И да, 188.165.200.156 – это так же один из 5 интересных адресов.

Так вот, чтобы подтвердить предположение в рамках текущего наглядного расследования, что за IP 188.165.200.156 «сидит» кто-то очень похожий на «русского товарища» выделим следующую строку:

17.12.2018 18:18:00	17.12.2018 18:18:00	188.165.200.156	Books	2017-14	986	186a81cee9d9900f42f700bc53a9da08f5ba6cd2ab56b885e3157f063f203871e01c95d2877325710a1859a66c71a379

По id торрента направляем запрос Downloaded torrents info by ID и получаем ответ кто и с каких ip качал торрент с заданным id. Результат выглядит следующим образом:

image

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

Итоговая схема и странный ресурс

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

image

В процессе возникали различные трудности, причем, по некоторым входным данным Hybrid-analysis показывал отсутствие информации, а сервис Virustotal по запросу из Lampyre возвращал один срез данных, при поиске из интерфейса по адресу www.virustotal.com/#/home/upload предоставлял другой набор данных, через поиск из интерфейса с адреса www.virustotal.com/gui/home/upload – самые полные данные. Несколько связей на итоговой схеме – составлены в Lampyre в ручном режиме создания ребер.

На мой взгляд, на схеме достаточно четко показана взаимосвязь ip-адресов, названия и hash значения вредоносных файлов. Выделяется область на графе из ip-адресов: 151.80.147.153, 188.165.200.156, 5.135.183.146, 54.38.49.245, 149.202.30.7,
IP-адреса установленные аналитиками GIB — 151.80.147.153, 188.165.200.156, 5.135.183.146, 185.190.82.182, 109.69.8.34

Как видно из схемы, IP-адреса, представленные в отчете GIB — 185.190.82.182, 109.69.8.34 связаны с hash: b0cde90e300e6d86394de375cd62bb462962016521d94ee987922e61c5e4977a, который в свою очередь связан с объектом Hybrid report – с вредоносом August.scr, который первый раз зафиксирован в августе 2017 года.

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

image

По-хорошему дальше расследование можно было бы продолжить, имея на руках логи доступа управления, регистрации, оплаты и так далее к IP адресам провайдера OVH. Но увы, таких данных нет, и расследование можно было бы завершать, но…

В ходе расследования, просматривая содержание web страниц ресурсов не выходил из головы французский ресурс arthurgarnier.fr

image

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

Ресурс якобы принадлежит французскому инженеру «Arthur Garnier», на ресурсе даже указано его резюме — arthurgarnier.fr/CV_A_Garnier.pdf. Из которого возможно узнать: github.com/ArthurGarnier, www.linkedin.com/in/arthur-garnier-13326880. Причем, согласно резюме, оно составлено на конец 2017 года, в github.com пишет крайне редко. В профиле www.linkedin.com указано, что с октября 2017 года по настоящее время Артур работает инженером в Groupe SII. И вроде бы ничего, но, то самое но… на странице помимо прочего указан адрес twitter аккаунта Артура twitter.com/Dark_Arthur

image

и тут при переходе в аккаунт

image

Кто стоит за этим профилем, почему на сайте Артура указан русскоязычный твиттер-аккаунт, а не предполагаемо настоящий, позже найденный, аккаунт: twitter.com/UpsiloN1X – остается вопросом.

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

Остались вопросы, по аккаунту в Twitter, по перечню IP адресов, почему столько информации про «русскоязычный след». Думаю, продолжить самостоятельное расследование возможно было бы обратившись к истинному Артуру, если он до сих пор управляет своим сервером (если сервер вообще его).

Теги:

Source: habr1

Метки:





Запись опубликована: 19.01.2019

Создание продуктов, формирующих привычки

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

Существует четыре этапа модели крючка:

  1. Триггер (внутренний, внешний);
  2. Действие;
  3. Переменное вознаграждение;
  4. Инвестиции.

1. Триггеры

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

Триггер — это сигнал потребителю совершить какое-либо действие, они срабатывают на первом этапе модели крючка.

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

Внутренний триггер – это определенная ассоциация, закрепленная в мозгу потребителя и побуждающая его к действиям. В качестве внутренних триггеров часто выступают негативные эмоции.

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

Внешние триггеры

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

В интернете внешний триггер может принимать форму хорошо заметного элемента вроде большой оранжевой кнопки «Войти».

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

Типы внешних триггеров 

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

1. Платные триггеры 

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

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

 2. Бесплатные триггеры

Эти триггеры бесплатны в том смысле, что их нельзя купить напрямую, но часто требуют инвестиций в форме времени, потраченного на связи с общественностью и СМИ.

К эффективным способам привлечь к себе внимание относятся положительные отклики в прессе, популярные вирусные видео и удачное размещение приложения в App Store. Компании могут убедить себя, что рост скачиваний или скачок продаж означает долгосрочный успех, но обычно известность, вызванная бесплатными триггерами, недолговечна. Чтобы бесплатные триггеры постоянно привлекали новых потребителей, компании должны все время держать свои продукты в центре внимания, а это трудная задача с почти непредсказуемым результатом.

3. Триггеры отношений 

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

4. Внедренные триггеры

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

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

Задача платных и бесплатных триггеров, а также триггеров отношений состоит в том, чтобы привлекать новых пользователей. Задача внедренных триггеров — обеспечивать их постоянное обращение к продукту до тех пор, пока не сформируется привычка. Без внедренных триггеров и молчаливого согласия потребителя на их постоянное появление трудно побуждать его использовать продукт настолько часто, чтобы изменить поведение и сформировать привычку.
Когда привычка сформирована, пользователями управляют уже другие триггеры – внутренние.

Внутренние триггеры

Внутренние триггеры возникают в том случае, когда продукт становится тесно связанным с мыслями, чувствами или предыдущим опытом людей.

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

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

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

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

Создание триггеров

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

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

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

Вот что пишет Эрика Холл, автор книги Just Enough Research: «Когда исследование фокусируется на том, что люди действительно делают  (смотрят ролики про кошек), а не на том, что они хотели бы делать  (создавать домашнее видео профессионального качества), это расширяет ваши возможности».

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

Первостепенную роль в разработке правильного продукта играет четкое описание потребителей – их желаний, эмоций, контекста, в котором продукт используется.
Еще один способ – задавать себе вопрос «почему?», пока не доберешься до эмоции, лежащей в основе желания.

Когда необходимо выяснить, почему люди используют продукты, вызывающие привыкание (то есть докопаться до внутренних триггеров), именно вопрос «почему?» может помочь. Представим, что вы впервые создаете такую фантастическую технологию, как электронная почта. Целевой пользователь – занятой менеджер среднего звена по имени Джули. Мы подробно описали Джули и при помощи этого словесного портрета отвечаем на серию «почему?».

Почему № 1 Почему Джули захочет пользоваться электронной почтой? Ответ. Чтобы отправлять и получать сообщения. 

Почему № 2 Почему она захочет это делать? Ответ. Потому что ей нужно быстро обмениваться информацией. 

Почему № 3 Почему она захочет это делать? Ответ. Чтобы знать, что происходит в жизни ее коллег, друзей и родственников.

Почему № 4 Почему она хочет это знать? Ответ. Чтобы понять, нуждаются ли в ней.

Почему № 5 Почему это ее беспокоит? Ответ. Она боится одиночества.

Вот теперь у нас кое-что есть! Страх – мощный внутренний триггер. Мы способны разработать наш продукт так, чтобы помочь Джули ослабить этот страх. Конечно, мы могли бы прийти к иному заключению, начав расспрашивать о другом человеке, меняя его портрет или иначе сформулировав вопросы. Только четкое понимание потребностей пользователя поможет составить требования к продукту. Теперь, зная боль потребителя, переходим к следующему этапу тестирования нашего продукта, чтобы понять, облегчает ли он ее.

Практика. Что делать?

Ответить себе на вопросы:

  •  Кто использует ваш продукт?
  •  Что потребитель делает перед тем, как должна сработать привычка, которую вы пытаетесь сформировать?
  •  Предложите три внутренних триггера, которые могут подтолкнуть потребителя к действиям, воспользовавшись методом «Пять почему»
  •  С какими внутренними триггерами ваш потребитель сталкивается чаще всего?
  •  Закончите это короткое описание, вставив в него наиболее частый внутренний триггер и привычку, которую вы хотите сформировать: «Каждый раз, когда пользователь ( внутренний триггер ), он ( первое действие, обуславливаемое формируемой привычкой )».
  •  Вернитесь к вопросу о том, что потребитель делает перед тем, как должна сработать привычка, которую вы пытаетесь сформировать. Какое место и время можно выбрать, чтобы направить ему внешний триггер?
  •  Как можно максимально близко совместить во времени внешний триггер с внутренним? Придумайте не менее трех привычных способов направить триггер вашему пользователю при помощи имеющихся технологий (электронной почты, уведомлений, SMS и т. п.). Затем пофантазируйте и предложите как минимум три невероятные идеи относительно передачи триггера (носимые компьютеры, биометрические датчики, голубиная почта). Возможно, эти фантазии подтолкнут вас к новым подходам, которые окажутся не такими уж безумными.

2. Действие

Следующий этап модели крючка – фаза действия.
Триггер – внутренний или внешний – конечно, подскажет пользователю, что он должен делать дальше. Однако если потребитель этого не сделает, триггер окажется бесполезным. Чтобы человек последовал сигналу, должно выполняться правило «легче сделать, чем подумать». Помните, для привычки характерно почти или совсем не задумываться. Чем больше усилий – физических или умственных – требуется для выполнения нужного вам действия, тем с меньшей вероятностью оно будет выполнено.

Если действие так важно для формирования привычки, как разработчик может заставить пользователя действовать?

Есть множество теорий, описывающих то, что движет человеческим поведением. Но мы рассмотрим модель профессора Би Джей Фогга, директора лаборатории мотивационных технологий Стэнфордского университета, поскольку она относительно просто описывает мотивы наших действий.

Фогг утверждает: для инициирования любых поступков требуется наличие трех ингредиентов:

  1. Пользователь должен иметь достаточную мотивацию;
  2. Он должен иметь возможность завершить требуемое действие;
  3. Нужен триггер, который его активирует.

1. Мотивация

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

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

2. Возможность

В своей книге «Something Really New: Three Simple Steps to Creating Truly Innovative Products» Денис Хоуптли разделяет инновационный процесс на фундаментальные этапы. Сначала он предлагает понять причину, по которой люди используют продукт. Затем – описать шаги, необходимые потребителю, чтобы получить результат. А когда последовательность задач от намерения до реализации станет понятной, советует начать удалять звенья цепочки до тех пор, пока она максимально не упростится. Люди быстрее примут технологию или продукт, где для достижения результата нужно делать меньше шагов. По мнению Хоуптли, чем легче – тем лучше.

Фогг описывает шесть «элементов простоты» – факторов, влияющих на сложность задачи. Вот они.

  1. Время: сколько его требуется на выполнение действия.
  2.  Деньги: финансовые затраты на выполнение действия.
  3. Физические усилия: количество труда, связанного с выполнением действия.
  4.  Умственные усилия: умственное напряжение и сосредоточенность, необходимые для выполнения действия.
  5.  Социальная приемлемость: насколько одобряется это действие обществом.
  6.  Необычность: по словам Фогга, это «степень соответствия действия привычному поведению».

Иными словами, нужно определить, что затрудняет потребителю выполнение требуемого действия?
Может быть, он ограничен временем? Ему жалко денег? Он измотан после трудового дня? Продукт слишком сложен для понимания? Социальное окружение пользователя расценит такой поступок как неприемлемый? Или действие так сильно отклоняется от привычного поведения потребителя, что отпугивает его своей необычностью?

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

Практика. Что делать?

Ответьте на вопросы, а также выполните предлагаемые упражнения:

  •  Пройдите путем, которым должны двигаться пользователи вашего продукта с момента ощущения внутреннего триггера до получения требуемого результата. Сколько шагов отделяет их от желаемого вознаграждения? Насколько весь процесс прост? А при сравнении с продуктами конкурентов?
  •  Какие ресурсы ограничивают возможности ваших потребителей по совершению действий, которые должны войти в привычку: – время; – деньги; – физические усилия; – умственные усилия (слишком сложно); – социальная приемлемость (нестандартно); – необычность (слишком ново)?
  •  Проведите мозговой штурм, чтобы найти три реальных способа облегчить клиентам выполнение требуемых действий.
  •  Подумайте, как можно применить эвристики, чтобы повысить вероятность совершения действий, формирующих привычку.

3. Переменное вознаграждение

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

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

Три типа переменного вознаграждения

1. Вознаграждение племени

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

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

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

Вознаграждение племени заставляет человека постоянно возвращаться к продукту и желать все большего.

2. «Вознаграждение добычей»

Вознаграждение добычей – стремление к обладанию материальными ресурсами и информацией.

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

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

Пример:Twitter 

Многие современные онлайн-продукты держатся на «фиде», сводке нового контента. Бесконечный поток информации, представленный в виде ленты новостей, которую можно прокручивать, заставляет пользователя пускаться в погоню за добычей.

Лента Twitter, например, заполнена разным контентом, как неинтересным, так и близким пользователю. Эта переменчивость обеспечивает соблазнительно непредсказуемые впечатления. Здесь можно случайно натолкнуться на особенно интересную новость, а можно и ничего не найти. И все равно охота на новую информацию продолжается. Ведь все, что нужно, – это движение пальца или вращение колесика мыши. И пользователи прокручивают, прокручивают, прокручивают информацию в погоне за переменным вознаграждением в виде интересного им твита

3. Внутреннее вознаграждение

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

Понаблюдайте за человеком, который тратит массу времени, чтобы собрать пазл размером с обеденный стол. Можно заметить, как его лицо искажает гримаса недовольства, и даже услышать проклятия, произносимые шепотом. Хотя готовые пазлы не обещают никакой награды, для кого-то сам процесс поиска нужной детали – удивительная и завораживающая задача.

В работе Эдварда Диси и Ричарда Райана говорится, что внутреннее вознаграждение питается «внутренней мотивацией». Их теория самоопределения состоит в том, что люди, помимо прочего, желают удовлетворить чувство компетентности. И если к этой цели добавить элемент тайны, задача покажется еще привлекательнее.

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

Пример: Электронная почта 
Пример того, как стремление к мастерству, завершенности и компетентности заставляет пользователей совершать привычные и часто бессмысленные вещи.
Проверяете ли вы почту без особой причины? Возможно, вы неосознанно решили открыть ее, чтобы увидеть, не ждут ли вас новые письма? Для многих цель, к которой нужно стремиться, – это минимальное количество непрочитанных сообщений.

Вывод:

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

Практика. Что делать?

1. В рамках открытого интервью выясните у пяти клиентов, что им нравится в вашем продукте, что радует в нем.
Бывают ли моменты, когда он приятно удивляет их?
Что в нем вызывает у них чувство особенно сильного удовлетворения?

2 Изучите шаги, которые предпринимает человек, привычно пользующийся вашим продуктом. Какой результат (вознаграждение) ослабляет его боль?
Решает ли вознаграждение свою задачу, поддерживая при этом у пользователя желание большего?

3 Проведите мозговой штурм в поиске трех способов усилить стремление ваших потребителей к получению переменного вознаграждения, используя:

  •  Вознаграждение племени – одобрение со стороны других людей;
  • Вознаграждение добычей – материальные предметы, деньги или информацию;
  • Внутреннее вознаграждение – мастерство, завершенность, компетентность или последовательность.

4. Инвестиция

Инвестиция – это когда пользователь что-то вкладывает в продукт: время, данные, усилия, социальный капитал или деньги.

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

В Twitter, например, инвестиции принимают форму подписки на твиты другого пользователя. Никакого немедленного вознаграждения для подкрепления этого действия не предполагается – ни звездочек, ни знаков отличия. Подписка – это инвестиции в сервис, которые увеличивают вероятность того, что человек снова посетит сайт Twitter.

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

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

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

Виды инвестиций:

Хранение ценности 

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

Контент 

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

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

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

Репутация

Репутация – это такая форма хранимой ценности, которую пользователи могут в буквальном смысле слова положить в банк.

На электронных торговых площадках вроде eBay, TaskRabbit, Yelp и Airbnb к людям с негативными оценками относятся совсем иначе, чем к тем, у кого отличная репутация.
Это часто определяет, какую цену получит продавец за свой товар.

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

Навыки 

Одна из форм инвестиций и хранимой ценности – время и усилия, потраченные на изучение продукта. Когда в распоряжении человека окажется новый навык, ему станет легче пользоваться сервисом.

Возьмем, к примеру, Adobe Photoshop – наиболее распространенную программу для профессионального редактирования изображений. Для их создания и обработки в ней имеются сотни сложных функций. Поначалу пользоваться программой нелегко. Но по мере ознакомления с ней пользователи, инвестирующие часы в просмотр обучающих видеороликов и чтение руководств, приобретают все больше опыта. Их эффективность растет. А еще они начинают чувствовать свое мастерство (внутреннее вознаграждение). К сожалению профессионалов в сфере дизайна, большинство этих знаний не пригодится для приложений-конкурентов. Инвестировав столько усилий в приобретение нового навыка, люди вряд ли согласятся переключиться на другие программы.

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

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

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

Практика. Что делать?

  • Еще раз взгляните на последовательность действий пользователя вашего продукта. Какие незначительные усилия он должен совершить, чтобы с большей вероятностью вернуться к вам?
  • Проведите мозговой штурм и выявите три способа осуществления небольших инвестиций в ваш продукт, чтобы пользователь смог:
    – загрузить следующий триггер;
    – повысить ценность ресурса за счет хранения данных, контента, базы читателей и приобретения новых знаний.
  • Определите время, которое требуется загруженному триггеру, чтобы побудить пользователей вернуться к вашему продукту. Как можно уменьшить это время, чтобы сократить цикл прохождения по всем этапам модели крючка?

Тестирование привычки

Если вы занимаетесь разработкой вызывающих привыкание продуктов, письменно ответьте на следующие вопросы:

  •  Какие привычки требуются для вашей бизнес-модели?
  •  Какую проблему потребителей решает ваш продукт?
  •  Как пользователи решают эту проблему сейчас и почему она требует решения?
  •  Насколько часто потребители будут обращаться к вашему продукту?
  •  Какие действия людей вы хотите превратить в привычку?

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

Шаг 1. Определите

 
Первый вопрос при тестировании привычки: кто обычно пользуется вашим продуктом?
Помните: чем чаще к нему обращаются, тем больше вероятность формирования привычки.

Для начала определите, что значит быть горячим поклонником вашего продукта. Как часто следует  его использовать? Ответ на этот вопрос очень важен и способен сильно повлиять на вашу точку зрения. Помочь определиться с аудиторией и критериями использования могут открытые данные о похожих продуктах и решениях. Если таких данных нет, можно сделать обоснованные предположения – но реалистичные и честные.

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

Шаг 2. Закодируйте

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

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

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

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

Внимательно изучите данные в поисках закономерностей. Вы ищете «путь привычки» – последовательность сходных действий, характерных для ваших самых преданных пользователей.

Например, разработчики Twitter давно заметили: как только новый пользователь подписывается на 30 человек, он переходит Рубикон, после которого шансы на его лояльность ресурсу резко возрастают.

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

Шаг 3. Измените

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

К ним относятся улучшение этапа регистрации, изменение контента, отказ от некоторых функций или, наоборот, усиление акцента на какой-то из них.

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

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

Теги:

Source: habr1

Метки:





Запись опубликована: 19.01.2019

[Из песочницы] Диагностическая медицинская экспертная система на Prolog

Вступление

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

Использовалась реализация Prolog — Visual Prolog, с встроенными библиотеками GUI. Но если
вы хотите написать GUI на Qt/C++, то в документации есть инструкция, как импортировать программу в DLL, и скомпилировать ее вместе с C/C++ проектом. Отсюда следует, что совместить можно и с другими языками.

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

Описание назначения системы: есть набор параметров, которым должен соответствовать кардиосигнал(ЭКГ), по которым можно определить заболевание. Человек отвечает на вопросы системы(в режиме диалога), и система, выступая в качестве эксперта по кардиозаболеваниям, делает выводы о потенциальном заболевании человека.

Т.е. данный код можно рассматривать как каркас(prolog-фреймворк), для создания экспертных систем из других областей, просто подставив свои правила, свои данные. Правила, по которым осуществляется вставка будут описаны ниже.

Исчисление предикатов первого порядка и язык Пролог

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

Языковые конструкции Пролога можно представить в виде импликаций вида:

A1, A2, …, An <= B1, B2, …,Bm (n>=0, m>=0) (1)

где Ai и Bi – атомарные формулы Fi(t1, t2, …, tk) или отрицание Fi(t1, t2, …, tk), где tk – термы(индивидная константа, переменная или результат применения функции)

В Прологе все отношения записываются как факты и правила, где n=1 в формуле (1), для повышения эффективности логического вывода. Правилам соответствует формула, называемая формулой Хорна:

A<=B1, B2, …, Bm ,где m>0 (2)

Фактам соответствует формула (2) при m=0:

A<= (3)

Формулой, которую нужно доказать в процессе механизма вывода, является формула (1) при n=0, m>0, называется целью или запросом:

<= B1, B2, …Bm (4)

Из этих языковых конструкций состоит вся программа на Прологе.
Например, следующее знание, в виде предложения на естественном языке – “Сын Ани любит Машу” можно записать в виде факта:

любит(сын(аня), маша)

а предложение “Аня любит всех, кого любит Оля” в виде:

(любит(аня,X)<=любит(оля,X))

Или рассуждение “Каждый человек смертен. Конфуций — человек”:

(человек(конфуций)& (смертен(X)<=человек(X)) <= смертен(конфуций)

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

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

Но дальше встает вопрос о выборе реализации этого языка, и было решено целесообразным разрабатывать ЭС на расширении языка Пролог – Visual Prolog.

Visual Prolog

Visual Prolog – диалект языка Пролог с объектно-ориентированным расширением вместе с интегрированной средой разработки. Эта среда обеспечивает поддержку создания графических интерфейсов и многих других библиотек. Язык Пролог довольно популярный для создания ЭС, с простым синтаксисом, схожим по смыслу с отношениями предметной области и фактами. Вообще сам интерпретатор языка Пролог можно рассматривать как ЭС в терминах логики предикатов первого порядка, в которой пользователь задает вопрос в виде цели, истинность которой нужно доказать. Это декларативный язык, в нем описывается, что нужно получить, вместо последовательного алгоритма, прекрасно подходит для описания знаний небольшой ЭС. По сравнению с альтернативными средами AMZI Prolog и SWI-Prolog, предоставляет очень эффективный интерфейс взаимодействия с другими языками как с помощью компоновки объектных файлов или с помощью динамической загрузки DLL-библиотек, как других языков, так и как самостоятельный DLL-модуль. Также Visual Prolog хорошо документирована, имеет множество примеров. Также существует мнение, что выбор языка реализации, способа представления знаний и метода формирования рассуждений вторичны, по сравнению со знаниями эксперта, и влияют лишь на механизм их успешного использования. Тем не менее, наличие литературы с использованием пролога как средства создания ЭС говорит о пригодности его использования, по крайней мере в небольших системах.

Проектирование ЭС

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

Существует 2 типа организации экспертных систем: на правилах и на фактах.

Знания ЭС на правилах записывается в виде продукционных правил. Левая часть каждого правила содержит какаю-то альтернативу решения вопроса, а правые части (посылки) специфицируются другими правилами. Единственное исключение – когда правило проверяет наличие в базе данных информации, например ответа на вопрос. Алгоритм работы механизма вывода сводится к сопоставлению, затем при множестве вариантов выбирается нужный в соответствии с заложенным принципом разрешения конфликта и в конце применяется выбранное правило и все начинается сначала. Плюсы у такой организации в том, что очень легко добавлять правила в систему без влияния на другие правила, а дополнять и модифицировать легко, так как программисту нужно просто вставить нужное правило в подходящий блок правил. Также такая организация имеет ограничения, а именно придется организовывать неестественный алгоритм сохранения трассировки или использовать для нее переменную в правилах, но это нарушит удобство модификации правил, так как для каждого предиката правила придется организовывать сохранения трассировки. Также это нарушит читабельность программы и возможность модификации вообще механизма вывода, так как вместе с информацией о правилах будет содержаться учет обхода посредством действия механизма вывода. Дополнительно Пролог не позволяет сохранять правила в файл базы данных и читать правила из базы данных, что не позволило бы обновлять базу знаний во время работы программы. Листинг 1 приводит пример такой организации базы знаний.

Листинг 1

diag("SIRS"):-
diag2("SIRS").
diag("Sepsis"):-
diag("SIRS"),
have("Sepsis character").
diag("Hard sepsis"):-
diag("Sepsis"),
have("Hard sepsis character").
diag("Shock sepsis"):-
diag("Hard sepsis"),
have("Shock sepsis character").
diag("MOF"):-
diag("Hard sepsis"),
have("MOF sepsis character").
diag("MOF"):-
diag("Shock sepsis"),
have("MOF sepsis character").

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

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

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

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

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

Еще систему на фактах тяжелее тестировать из-за ее зависимости от фактов, так как в системе на правилах просто ошибка отразилась бы на механизме вывода, и это сразу бы стало видно, но на фактах скорее всего продолжит дальше работать.

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

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

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

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

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

Реализация

На языке Пролог правила реализованы в виде предиката rule. Каждое правило имеет свой номер и название, которое является гипотезой (заключением), которую нужно доказать. Условию правила соответствует неявное утверждение, которое полностью определяет истинность гипотезы.

Условие правила:

Colclusion(K)=C1(K) and (C2(K) or C3(K)) and C4(K)

C1(K) = Истинны все заключения правил с номерами, записанных в первом списке для K-ого правила

С2(K) = Истинно хотя бы одно правило из второго списка для K-ого правила
С3(K) = Истинно ровно N(K) заключений правил из второго списка для K-ого правила

C4(K) = Предикат для K-ого правила(предикат doc(K)), который описывает пользователь.
Если любой список пуст, значит соответствующее утверждение истинно.

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

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

Главные принцип вывода – чтобы доказать истинность заключения, доказать последовательно все его заключения в первом списке, затем доказать заключения второго списка и в конце проверить истинность предиката соответствующего номеру текущего правила. Для проверки второго списка, в случае нахождения хотя бы одного истинного правила, будут проверены все дальше идущие правила до конца списка.

Описание предикатов

В общем, принцип кодирования знаний реализован на Прологе с помощью двух предикатов в следующем виде:

rule(K,”Текст заключения — имя правила”, Id, List1, List2, N)
doc(K)
K — номер правила
Id — Идентификатор данных для данного правила
List1 – первый список номеров правил
List2 – второй список номеров правил
N – число истинных заключений

Причем rule всегда записывается как факт, без переменных, и его истинность, как было сказано, определяет помимо списков, соответствующий предикат doc.

Вот несколько примеров записи знаний:

rule(93,«TASH — TASH-score 43% »,tashSc10,[47],[],0)
rule(33,«TASH – Избыток оснований – есть сумма баллов»,none,[],[29,30,31,32],1).

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

Таким образов все знания записываются с помощью этих двух предикатов.

В предикатах doc в основном вызываются функции пользовательского интерфейса, так как некоторые правила по смыслу неразрывно связаны с ответом пользователя или в них проводятся проверки на допустимые значения.

Например, предикаты doc для правил, истинность которых зависит от интервала, в котором находится суммарный балл, делают соответствующие проверки.

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

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

Примеры кода

Проект большой, поэтому приведу наиболее важные отрывки.

Листинг 2 — Список правил

rule(11,"Sepsises - SIRS призн. 1: t>38C или t<36С",sirsPr1,[],[],0).
rule(12,"Sepsises - частота сердечных сокращений>90",sirsPr2,[],[],0).
rule(13,"Sepsises - частота дыхания>20 или PaCO2<32mmHg",sirsPr3,[],[],0).

Листинг 3 — Список фактов

fact1(sirsPr1,"SIRS","SIRS призн. 1: t>38C или t<36С").
fact1(sirsPr2,"SIRS","частота сердечных сокращений>90").
fact1(sirsPr3,"SIRS","частота дыхания>20 или PaCO2<32mmHg").
fact1(sirsPr4,"SIRS","кол-во лейкоцитов>12.000/mm>3, <4.000/mm>3 или >10% band").

— Список логических следствий

tash_score(1,tashSc1,0,8,"Вероятность прогноза <5%").
tash_score(2,tashSc2,9,9,"Вероятность прогноза 6%").
tash_score(3,tashSc3,10,10,"Вероятность прогноза 8%").

Листинг 4 — Машина вывода

sizeList([],0):-!.
sizeList([_T],Size):-
sizeList(T,SizeTail),
 Size=SizeTail+1.
append_der_list([],List,List).
append_der_list([HL1],List2,[HL3]):-
    append_der_list(L1,List2,L3).
any2(NeedSize,NeedSize,_,[],[],_):-!.
any2(_,_,[],[],[],_):-!.
any2(NeedSize,Size,[HT1],[HT2],[FirstDerOtherDer],Why):-
 Nomer=[H],
 go(Nomer,UnderFirstDer,Why),
 rule(H,Text,_,_,_,_),
 FirstDer=tree(Text,unmarked,UnderFirstDer,0),%der(H,UnderFirstDer),
 Size1=Size+1,!,
 any2(NeedSize,Size1,T1,T2,OtherDer,Why).
any2(NeedSize,Size,[_T1],List,OrDer,Why):-
 !,any2(NeedSize,Size,T1,List,OrDer,Why).
go([],[],_):-!.
go([HT],[FirstDerOtherDer],Why):-
 rule(H,Name,_,ListAnd,ListOr,KolOr),
 NewWhy=[NameWhy],
 go(ListAnd,UnderFirstDer,NewWhy),
 goOr(ListOr,KolOr,_,OrDer,NewWhy),
 append_der_list(UnderFirstDer,OrDer,TwoDers),
 FirstDer=tree(Name,unmarked,TwoDers,0),
 asserta(why_trace(NewWhy)),
 doc(H,NewWhy),
 go(T,OtherDer,Why).
goOr([],_,[],[],_):-!.
goOr(ListOr,KolOr,ListYes,OrDer,Why):-
 KolOr<>0,
 any2(KolOr,0,ListOr,ListYes,OrDer,Why),
 sizeList(ListYes,KolOr).
goOr(ListOr,0,ListYes,OrDer,Why):-
 any2(100000,0,ListOr,ListYes,OrDer,Why),
 sizeList(ListYes,KolListYes),
 KolListYes>0.

Листинг 5 — вывод конечных следствий

tashQuestion(Id):-
 fact2(Id,_,Prisnak,_),
 pos(Prisnak),!.
tashQuestion(Id):-
 fact2(Id,_,Prisnak,_),
 neg(Prisnak),fail,!.
tashQuestion(Id):-
 fact2(Id,_,Prisnak,Ball),
 not(neg(Prisnak)),
 not(pos(Prisnak)),
 dialog_ynw(Prisnak,Ans),
 tash_in_data_base(Ans,Prisnak,Ball),!.
tash_in_data_base("y",Prisnak,Ball):-
 asserta(pos(Prisnak)),sum_tash(Sum1),Sum2=Sum1+Ball,asserta(sum_tash(Sum2)),!.
tash_in_data_base("n",Prisnak,_):-
 asserta(neg(Prisnak)),!,fail.
tash_in_data_base(_,_,_):-
 write("nTASH-not correct answer"),!,fail.
oneQuestion(Id):-
 fact1(Id,_,Prisnak),
 pos(Prisnak),!.
oneQuestion(Id):-
 fact1(Id,_,Prisnak),
 not(neg(Prisnak)),
 question_sepsis(Prisnak),!.

Выводы

Надеюсь, эта статья поможет начинающим построить свою экспертную систему.

Теги:

Source: habr1

Метки:





Запись опубликована: 19.01.2019

[Из песочницы] Из чего состоит IoT

image
Если обратиться к википедии в поисках определения для термина “интернет вещей”, можно увидеть следущее:

Интернет вещей (англ. Internet of Things, IoT) — концепция вычислительной сети физических предметов («вещей»), оснащённых встроенными технологиями для взаимодействия друг с другом или с внешней средой, рассматривающая организацию таких сетей как явление, способное перестроить экономические и общественные процессы, исключающее из части действий и операций необходимость участия человека.

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

Базовые элементы делятся на несколько типов: сенсоры, актуаторы и гейты.

Сенсоры

Пожалуй нет смысла объяснять смысл и назначение этого типа элементов. Оно ничем не отличается от стандартных: разнообразные термометры, микрофоны, камеры и десятки прочих, менее распронённых устройств. Некоторые из них можно увидеть на изображении Sensors Starter Kit для Arduino:

image

Актуаторы

Данный тип элементов предназначается для того, чтобы воздействовать на окружающую среду, или на определённый объект в ней. Эту роль могут выполнять самые разнообразные устройства: от сервоприводов и динамиков до замков (конечно, электронных) с осветительными приборами.

Гейты

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

image

image

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

Добавив в ранее сконструированную модель актуатор в лице динамика, можно добиться того, чтобы проход каждого n-ного проходящего был подзвучен величественными фанфарами.

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

Транспорт

Теперь, когда уже более или менее ясно, какие устройства испольцуются для создания инфраструктуры, можно посмотреть на то, какими средствами эти устройства друг с другом взаимодействуют. Как видно на первом изображении, есть 2 условные группы — облако и переферия.

Ячейки, состоящие из вышеперечисленных типов устройств, как можно заметить, находятся в переферии и для коммуникации используют специальные протоколы взаимодействия. Более всего распространены LoRa и ZigBee. Обе эти сети являются очень медленными в сравнении, например, с 4G или даже с 3G, однако имеют и свои преимущества.

Одним из главных является их энергоэффективность. Дело в том, что идея интернета вещей заключается в создании среды устройств, коммуницирующих между собой без участия человека. Стоит заметить, что в некоторых случаях полностью избежать вмешательства человека избежать не удастся. Например, в системе подсчёта количества пошедших человек есть сенсор движения. Ему, как и любому другому электрическому устройству, необходимо питание. Проводить провода с питанием к каждому такому сенсору (если их больше 5 и они сильно разбросаны в пространстве) кажется не лучшей идеей. Соответственно, работать они будут от батареек или аккумуляторов. Если потребление заряда будет чрезмерным, элементы питания им нужно будет менять довольно часто. А это приведёт к тому, от чего стремится уйти интернет вещей — нужно же будет кому-то заменять эти батарейки. А вот если сенсоры будут энергоэффективны, то достаточно будет просто вставить батарейку и забыть об этом на год, два, пять и т. д.

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

Небольшое сравнение LoRa и ZigBee

Основные сравнительные характеристики image image
Топоогия звезда простые и mesh
Частотный диапазон (зависит от страны) 2,4 ГГц, 868/915 МГц, 433 МГц, 169 МГц 2.4 ГГц, 915 МГц, 868 МГц
Ноды сети
  • базовая станция
  • хост
  • роутер
  • координатор (один из роутеров)
  • хост
Дальность на открытом пространстве 10 — 15 км ~ 500 м (зависит от мощности передатчика)
Скорость 0.3 — 50 кбит/с 5 — 250 кбит/с

А вот между переферией и облоком, а так же и внутри облака, используются, обычно, знакомые и привычные всем wi-fi с ethernet, сотовые и спутниковые сети и т. д.

Сравнение разных видов сетей на основе скорости и дальности

image

Заключение

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

Так же не стоит забывать, что в облаках интернета вещей могут использоваться и другие технологии, помогающие раскрыть его потенциал в большей степени. Такими могут выступать и BigData, и BlockChain, и нейросети с машинным обучением. А ведь каждая из последних перечисленных технологий являет собой отдельную обширную область компьютерных (и не очень) наук.

Теги:

Похожие публикации

Source: habr1

Метки:





Запись опубликована: 19.01.2019

[Из песочницы] Антиспуфинг: как системы распознавания лиц противостоят мошенникам?

В этой статье попробую обобщить информацию о существующих методах liveness detection, которые применяются для защиты от взлома систем распознавания лиц.

facial biometrics

От чего защищаем?

С развитием облачных технологий и веб-сервисов все больше транзакций перемещается в онлайн-среду. При этом более 50% онлайн транзакций (ритейл) совершаются с мобильных устройств.

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

Случаи онлайн-мошенничества на 81% вероятнее, чем мошенничество в точках продаж.

16,7 млн. личных данных американцев были украдены только за 2017 год (Javelin Strategy and Research). Ущерб от мошенничества с захватом аккаунтов составил $5,1 млрд.

В России, по данным Group-IB, за 2017 год хакеры украли у владельцев Android-смартфонов более миллиарда рублей, что на 136% больше, чем годом ранее.

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

По данным Acuity Market Intelligence, к 2020 году общий объем биометрических транзакций, платежных и неплатежных, превысит 800 миллионов в год.

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

Методы liveness detection

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

Есть несколько классификаций методов liveness detection. В первую очередь их можно разделить на аппаратные и программные.

Аппаратные методы предполагают использование дополнительного оборудования, например, инфракрасных камер, термальных камер, 3D-камер. Благодаря низкой чувствительности к условиям освещения и способности фиксировать специфические различия в изображениях, данные методы считаются наиболее надежными, в частности, по результатам последних тестов iPhone X, оснащенный инфракрасной камерой, оказался единственным смартфоном, успешно выдержавшим атаки с помощью 3D-модели лица. К недостаткам таких методов можно отнести высокую стоимость дополнительных датчиков и сложность интеграции в существующие системы распознавания лиц.

Аппаратные методы – идеальное решение для производителей мобильных устройств.

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

Получается, достаточно приобрести современный смартфон с биометрией и инфракрасным датчиком «на борту» и проблема решена? Вполне логичный вывод, если бы не одно НО. Согласно прогнозам к 2020 году только 35% аутентификаций будут осуществляться посредством «встроенной» в мобильные устройства биометрии, при этом биометрические мобильные приложения будут использоваться в 65% случаев. Причина одна – подобные мобильные устройства стоят на порядок дороже, а значит не получат широкого распространения. Это означает, что фокус все же смещается в сторону программных методов, способных эффективно работать на миллиардах устройств с обычными камерами. На них и остановимся подробно.

Существует два типа программных методов: активные (динамические) и пассивные (статические).

Активные методы требуют сотрудничества со стороны пользователя. В этом случае система предлагает пользователю выполнить определенные действия в соответствии с инструкцией, например, моргнуть, повернуть голову определенным образом, улыбнуться и т.д. (протокол challenge-response). Отсюда проистекают недостатки подобных методов: во-первых, необходимость сотрудничества нивелирует преимущество системы распознавания лиц, как некооперативного типа биометрической аутентификации, пользователи не очень любят тратить время на лишние «телодвижения»; во-вторых, если требуемые действия заранее известны, защиту можно обойти путем воспроизведения видео или 3D-репликой с имитацией мимики/движений.

Суть таких методов в обнаружении движения по последовательности входных кадров для извлечения динамических признаков, позволяющих различать реальные и поддельные лица. Методы анализа основываются на том, что движение плоских 2D-объектов существенно отличается от движения реального человеческого лица, которое представляет собой 3D-объект. Поскольку активные методы используют более чем один кадр, они требуют больше времени на принятие решения. Частота движений лица обычно колеблется от 0,2 до 0,5 Гц., поэтому сбор данных для обнаружения спуфинга занимает более 3 секунд, в то же время человеческое зрение, способность которого, по сути, имитируют данные методы, определяет движение и строит карту структуры окружающей среды гораздо быстрее.

В отличие от активных, пассивные методы не требуют участия пользователя и опираются на данные анализа одиночного 2D-изображения, что обеспечивает быстрый отклик и удобство для пользователя. Самые используемые: методы, основанные на спектре Фурье (поиск разницы в интенсивности светоотражения 2D и 3D-объектов) и методы, извлекающие свойства текстур изображения. Эффективность данных методов снижается при изменении направления и яркости освещения. Кроме того, современные девайсы способны передавать изображение в высоком разрешении и естественном цвете, позволяя обмануть систему.

Что лучше?

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

Категория методов Принцип работы Преимущества Ограничения
Методы на основе движений (мимики) или темпоральные методы (динамические, реже статические) Фиксация непроизвольных движений мышц или действий по запросу Хорошая обобщающая способность* — Низкая надежность;
— медленный отклик (> 3 сек.);
— высокая сложность вычислений;
— эффективны против фотографий и 2D-масок.
Методы на основе анализа текстуры (статические) Поиск особенностей текстуры, характерных для напечатанного лица (размытости, сбои при печати и т.д.) — Быстрый отклик (< 1 сек.);
— требуется только одно изображение;
— низкая сложность вычислений;
— низкая стоимость;
— неинвазивный метод.
— Низкая обобщающая способность;
— уязвимы к атакам с помощью видеозаписи высокого разрешения.
Методы на основе анализа качества изображения (статические) Анализ качества изображения реального лица и поддельного 2D-изображения (анализ искажений, анализ распределения зеркальности) — Хорошая обобщающая способность;
— быстрый отклик (< 1 сек.);
— низкая сложность вычислений.
— Для разных типов спуфинговых атак требуются различные классификаторы;
— уязвимы перед современными девайсами.
Методы на основе 3D-структуры лица (динамические) Фиксация различий в свойствах оптического потока, генерируемого трехмерными объектами и двумерными плоскостями (анализ траектории движения, построение карты глубины) Высокая надежность методов (применительно к 2D-атакам и 3D-атакам) — Медленный отклик (> 3 сек.);
— чувствительность к освещению и качеству изображения.
Мультимодальные методы (статические и динамические) Сочетание двух и более биометрических методов — Высокая надежность;
— универсальность (возможность выбора модальности).
— Медленный отклик (> 3 сек.);
— возможность выбора модальности облегчает выбор наиболее простого метода атаки;
— сложность объединения признаков, извлеченных разными методами.
Методы с применением инерционных датчиков (динамические) Анализ соответствия движений лица движению камеры с помощью встроенных датчиков мобильного устройства (акселерометр и гироскоп) — Высокая надежность методов (применительно к 2D-атакам);
— необходимые датчики уже в комплектации смартфонов.

— Медленный отклик (> 3 сек.);
— результат зависит от точности измерений датчиков;
— чувствительность к освещению, окклюзии и мимике.


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

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

image

* По результатам анализа систем более 20 вендоров

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

Примером тому служит доклад исследователей из университета Северной Каролины, сумевших обмануть пять алгоритмов распознавания лиц с помощью текстурированных 3D-моделей голов добровольцев, созданных на смартфоне с использованием студийных фотографий и фотографий из социальных сетей, а также технологии виртуальной реальности для имитации движений и мимики. «Обманутые» системы как раз полагались на анализ действий пользователя (с построением структуры или просто проверкой наличия движений), по крайней мере, о других методах на тот момент вендоры систем не заявляли.

А вот метод FaceLive, на тот момент не использовавшийся в системах распознавания лиц, пропустил атаки только в 50% случаев. Механизм liveness detection сравнивает сходство между измеренными акселерометром изменениями направления движения мобильного телефона и изменениями лицевых ориентиров (нос, глаза и т.д.), наблюдаемыми на видео с камеры. Живой пользователь обнаруживается, если изменения положения головы в видео лица согласуются с движениями устройства. К недостаткам метода можно отнести зависимость от точности инерционных датчиков устройства, уровня освещения, мимики пользователя и большую длительность процедуры.

Успешно противостоять атакам с помощью 3D-модели, имитирующей мимику и движения, по мнению авторов доклада, способны анализ кровотока, световая проекция и использование инфракрасной камеры.

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

При использовании световой проекции встроенный в устройство или внешний источник света выдает вспышки через случайные промежутки времени. При попытке обмана система 3D-рендеринга должна уметь быстро и точно визуализировать проецируемые узоры освещения на модели. Требование наличия дополнительного оборудования выступает существенным ограничением.

Упомянутый доклад опубликован в 2016 году, за это время некоторые алгоритмы усовершенствовались. Так, некоторые вендоры заявляют о способности их систем успешно противостоять атакам с помощью 3D-масок.

Примером серьезного отношения к надежности технологии служат Apple и Microsoft. Face ID в свое время помогла привлечь внимание широкой аудитории к распознаванию лиц, демонстрируя, как может выглядеть будущее безопасности личных данных. Но вскоре после запуска появились десятки видеороликов (по большей части фейковых) на тему обмана технологии. В 2017 году распознавание лиц Windows Hello удалось обмануть с помощью печатного изображения. Возвращаясь к результатам тестов Forbes можно констатировать, что компании с тех пор проделали большую работу, в результате их системы взломать не удалось.

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

Подведем итоги

  • Разработчиков систем распознавания лиц, безусловно, заботят вопросы безопасности, защиту от спуфинга в той или иной форме предлагают все вендоры (ну или заявляют о ее наличии), исключение – некоторые производители мобильных устройств, но они, как правило, предупреждают о возможности обмана технологии распознавания лиц, предлагая ее в качестве дополнительного фактора защиты.
  • Традиционные методы, как правило, подвержены таким ограничениям, как зависимость от условий освещения, скорость отклика, интерактивность или высокая стоимость. Следовательно, требуется совершенствование алгоритмов для улучшения пользовательских качеств систем распознавания.
  • Механизмы защиты будущего должны предвидеть развитие технологий спуфинга и быстро адаптироваться к новым угрозам.
  • Внедрение современных алгоритмов сделает мошенничество «дорогим удовольствием», а значит нецелесообразным для большинства злоумышленников, т.е. чем больше технических средств и навыков требуется для совершения атак, тем более защищенными могут себя чувствовать пользователи.
  • Присутствие новых алгоритмов в Графике соотношения применения различных методов, пусть и в незначительных долях, свидетельствует о поиске вендорами более эффективных средств защиты от спуфинга. Компании экспериментируют, зачастую предлагая не один, а несколько методов liveness detection, что не может не вселять оптимизм касательно будущего систем распознавания лиц.
Теги:

Похожие публикации

Source: habr1

Метки:





Запись опубликована: 18.01.2019

Просто о внутренних и внешних настройках для приложения в Unity3D

Введение

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

По традиции начну с предыстории. За время работы в игровой индустрии я разрабатывал различные проекты, с разной сложностью и побывал и в лагере гейм-дизайна, и в лагере программистов (где нахожусь и по сей день). Ни для кого не секрет, что любое приложение требует большого числа различных конфигурационных данных и настроек. В классическом, относительно Unity3d виде, такие настройки выносятся в видимую часть инспектора, где вводятся какие-то цифры и т.п. Я думаю, что говорить об удобстве такого подхода не стоит, это даже если исключить, факт, того, что на время настройки, сцена, в которой находится MonoBehaviour класс блокируется для изменений другими разработчиками. Поэтому после череды разного рода мытарств в прошлом, я решил, написать что-то простое и эффективное, что облегчит всем жизнь и упростит работу с такими данными, чем и хочу поделиться с вами.

Примечание: весь описанный ниже код применим к версии Unity 2018.3+ и использует компилятор Roslyn (версия языка C# 7+).

Внутренние настройки

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

  • String
  • Int
  • Float
  • Bool

Все остальные данные можно легко уложить в них, а с учётом строки, хранить можно что угодно, используя JSON-сериализацию. Воспользуемся в качестве основы ScriptableObject, который подходит для решения этой задачи, как никто.

public class Setting : ScriptableObject
{
    public enum ParameterTypeEnum
    {
        Float,
        Int,
        String,
        Bool
    }
    [Serializable]
    public class ParameterData
    {
        public string Name => _name;
        public ParameterTypeEnum ParameterType => _parameterType;
        public string DefaultValue => _defaultValue;
        [SerializeField] private string _name;
        [SerializeField] private ParameterTypeEnum _parameterType;
        [SerializeField] private string _defaultValue;
    }
    [SerializeField] protected ParameterData[] Parameters;
}

Итак, в базе, мы имеем массив значений, представляющих из себя:

  • Имя параметра
  • Тип параметра
  • Значения параметра в виде строки

Примечание: почему строки? Мне показалось это более удобным, чем хранить 4 переменные разных типов.

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

protected readonly IDictionary<string, object> settingParameters = new Dictionary<string, object>();
[NonSerialized] protected bool initialized;
private void OnEnable()
{
    Initialization();
}
public virtual T GetParameterValue<T>(string name)
{
    if (settingParameters.ContainsKey(name))
    {
        var parameterValue = (T)settingParameters[name];
        return parameterValue;
    }
    else
    {
        Debug.Log("[Setting]: name not found [{0}]".Fmt(name));
    }
    return default;
}
protected virtual void Initialization()
{
    if (initialized) return;
    for (var i = 0; i < Parameters.Length; i++)
    {
        var parameter = Parameters[i];
        object parameterValue = null;
        switch (parameter.ParameterType)
        {
            case ParameterTypeEnum.Float:
            {
                 if (!float.TryParse(parameter.DefaultValue, out float value))
                 {
                     value = default;
                 }
                 parameterValue = GetValue(parameter.Name, value);
            }
            break;
            case ParameterTypeEnum.Int:
                {
                    if (!int.TryParse(parameter.DefaultValue, out int value))
                    {
                        value = default;
                    }
                    parameterValue = GetValue(parameter.Name, value);
                }
                break;
            case ParameterTypeEnum.String:
            {
                 parameterValue = GetValue(parameter.Name, parameter.DefaultValue);
            }
            break;
            case ParameterTypeEnum.Bool:
            {
                 if (!bool.TryParse(parameter.DefaultValue, out bool value))
                 {
                      value = default;
                 }
                 parameterValue = GetValue(parameter.Name, value);
             }
             break;
         }
         settingParameters.Add(parameter.Name, parameterValue);
    }
    initialized = true;
}
protected virtual object GetValue<T>(string paramName, T defaultValue)
{
    return defaultValue;
}

Инициализация выполняется в OnEnable. Почему не в Awake? Этот метод не вызывается для экземпляров, хранимых как ассет (вызывается он в момент CreateInstance, что нам не нужно). В момент запуска приложения для ассетов ScriptableObject вызывается сначала OnDisable, затем OnEnable.

Метод GetValue понадобиться нам далее, а для внутренних настроек, он просто возвращает значение по умолчанию.

Метод GetParameterValue наш основной метод для доступа к параметрам. Здесь стоит учесть, что несмотря на unboxing значений, параметры хранимые в Setting это в некоем роде константы, поэтому их следует забирать при инициализации сцен. Не стоит вызывать метод в Update.

Пример использования:

public class MyLogic : MonoBehaviour
{
    [SerializeField] private Setting _localSetting;
    private string _localStrValue;
    private int _localIntValue;
    private float _localFloatValue;
    private bool _localBoolValue;
    private void Start()
    {
        _localStrValue = _localSetting.GetParameterValue<string>("MyStr");
        _localIntValue = _localSetting.GetParameterValue<int>("MyInt");
        _localFloatValue = _localSetting.GetParameterValue<float>("MyFloat");
        _localBoolValue = _localSetting.GetParameterValue<bool>("MyBool");
    }
}

Мы написали основу и теперь нам нужен редактор, поскольку основной целью для нас было именно удобство для тех, кто работает с этими настройками.

Для добавления пункта меню с тем, чтобы иметь возможность создавать ассет можно использовать атрибут:

CreateAssetMenu(fileName = "New Setting", menuName = "Setting")

Теперь напишем кастомный инспектор, который позволит выводить данные по ассету и запускать внешний редактор.

[CustomEditor(typeof(Setting), true)]
public class SettingCustomInspector : Editor
{
    private GUIStyle _paramsStyle;
    private GUIStyle _paramInfoStyle;
    private const string _parameterInfo = "<color=white>Name</color><color=grey> = </color><color=yellow>{0}</color>  <color=white>Type</color><color=grey> = </color><color=yellow>{1}</color>  <color=white>Defualt Value</color><color=grey> = </color><color=yellow>{2}</color>";
    public override void OnInspectorGUI()
    {
       if (GUILayout.Button("Edit Setting"))
       {
            SettingEditorWindow.Show(serializedObject.targetObject as Setting);
       }
       EditorGUILayout.LabelField("Parameters:", _parametersStyle, GUILayout.ExpandWidth(true));
       var paramsProperty = serializedObject.FindProperty("Parameters");
       for (var i = 0; i < parametersProperty.arraySize; i++)
       {
            var paramProp = paramsProp.GetArrayElementAtIndex(i);
            var paramNameProp = paramProp.FindPropertyRelative("_name");
            var paramTypeProp = paramProp.FindPropertyRelative("_parameterType");
            var paramDefaultValueProp = paramProp.FindPropertyRelative("_defaultValue");
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(_paramInfo.Fmt(
                             paramNameProp.stringValue,
                             paramTypeProp.enumDisplayNames[paramTypeProp.enumValueIndex],
                             paramDefaultValueProp.stringValue),
                             _paramInfoStyle);
            EditorGUILayout.EndHorizontal();
        }
    }
    private void PrepareGUIStyle()
    {
        if (_parametersStyle == null)
        {
            _paramsStyle = new GUIStyle(GUI.skin.label);
            _paramsStyle.fontStyle = FontStyle.Bold;
            _paramsStyle.fontSize = 12;
            _paramsStyle.normal.textColor = Color.green;
            _paramInfoStyle = new GUIStyle(GUI.skin.label);
            _paramInfoStyle.richText = true;
         }
     }
}

Вот так это будет выглядеть:

image

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

public class SettingEditorWindow : EditorWindow
{
    public Setting SelectedAsset;
    private int _currentSelectedAsset = -1;
    private readonly List<string> _assetNames = new List<string>();
    private readonly IList<SerializedObject> _settingSerializationObjects = new List<SerializedObject>();
    private readonly IList<T> _assets = new List<T>();
    private readonly IList<int> _editedNames = new List<int>();;
    private GUIContent _editNameIconContent;
    private GUIStyle _headerStyle;
    private GUIStyle _parametersStyle;
    private GUIStyle _parameterHeaderStyle;
    private GUIStyle _nameStyle;
    private Vector2 _scrollInspectorPosition = Vector2.zero;
    private Vector2 _scrollAssetsPosition = Vector2.zero;
    private const string _SELECTED_ASSET_STR = "SettingSelected";
    public static void Show(Setting asset)
    {
        var instance = GetWindow<Setting>(true);
        instance.title = new GUIContent("Settings Editor", string.Empty);
        instance.SelectedAsset = asset;
    }
    private void OnEnable()
    {
        var assetGuids = AssetDatabase.FindAssets("t:{0}".Fmt(typeof(Setting).Name));
        foreach (var guid in assetGuids)
        {
            var path = AssetDatabase.GUIDToAssetPath(guid);
            var asset = AssetDatabase.LoadAssetAtPath<T>(path);
            _assetNames.Add(path.Replace("Assets/", "").Replace(".asset", ""));
            _assets.Add(asset);
            _settingSerializationObjects.Add(new SerializedObject(asset));
        }
        _currentSelectedAsset = PlayerPrefs.GetInt(_SELECTED_ASSET_STR, -1);
        _editNameIconContent = new GUIContent(EditorGUIUtility.IconContent("editicon.sml"));
    }
    private void OnDisable()
    {
        PlayerPrefs.SetInt(_SELECTED_ASSET_STR, _currentSelectedAsset);
    }
    private void PrepareGUIStyle()
    {
        if (_headerStyle == null)
        {
            _headerStyle = new GUIStyle(GUI.skin.box);
            _headerStyle.fontStyle = FontStyle.Bold;
            _headerStyle.fontSize = 14;
            _headerStyle.normal.textColor = Color.white;
            _headerStyle.alignment = TextAnchor.MiddleCenter;
            _parametersStyle = new GUIStyle(GUI.skin.label);
            _parametersStyle.fontStyle = FontStyle.Bold;
            _parametersStyle.fontSize = 12;
            _parametersStyle.normal.textColor = Color.green;
        }
    }
    private void OnGUI()
    {
        PrepareGUIStyle();
        if (SelectedAsset != null)
        {
            _currentSelectedAsset = _assets.IndexOf(SelectedAsset);
            SelectedAsset = null;
        }
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.BeginVertical(GUI.skin.box, GUILayout.MinWidth(350f), GUILayout.ExpandHeight(true));
        _scrollAssetsPosition = EditorGUILayout.BeginScrollView(_scrollAssetsPosition, GUIStyle.none, GUI.skin.verticalScrollbar);
        _currentSelectedAsset = GUILayout.SelectionGrid(_currentSelectedAsset, _assetNames.ToArray(), 1);
        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndVertical();
        EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true));
        var assetSerializedObject = (_currentSelectedAsset >= 0) ? _settingSerializationObjects[_currentSelectedAsset] : null;
        EditorGUILayout.Space();
        EditorGUILayout.LabelField((_currentSelectedAsset >= 0) ? _assetNames[_currentSelectedAsset] : "Select Asset...", _headerStyle, GUILayout.ExpandWidth(true));
        EditorGUILayout.Space();
        _scrollInspectorPosition = EditorGUILayout.BeginScrollView(_scrollInspectorPosition, GUIStyle.none, GUI.skin.verticalScrollbar);
        Draw(assetSerializedObject);
        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndVertical();
        EditorGUILayout.EndHorizontal();
        assetSerializedObject?.ApplyModifiedProperties();
    }
    private void Draw(SerializedObject assetSerializationObject)
    {
        if (assetSerializationObject == null) return;
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Parameters:", _parametersStyle, GUILayout.Width(20f), GUILayout.ExpandWidth(true));
        var parametersProperty = assetSerializationObject.FindProperty("Parameters");
        if (GUILayout.Button("Add", GUILayout.MaxWidth(40f)))
        {
            if (parametersProperty != null)
            {
                parametersProperty.InsertArrayElementAtIndex(parametersProperty.arraySize);
            }
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();
        if (parametersProperty != null)
        {
            for (var i = 0; i < parametersProperty.arraySize; i++)
            {
                var parameterProperty = parametersProperty.GetArrayElementAtIndex(i);
                var parameterNameProperty = parameterProperty.FindPropertyRelative("_name");
                var parameterTypeProperty = parameterProperty.FindPropertyRelative("_parameterType");
                var parameterDefaultValueProperty = parameterProperty.FindPropertyRelative("_defaultValue");
                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button(_editNameIconContent, GUILayout.MaxWidth(25f), GUILayout.MaxHeight(18f)))
                {
                    if (_editedNames.Contains(i))
                    {
                        _editedNames.Remove(i);
                    }
                    else
                    {
                        _editedNames.Add(i);
                    }
                }
                EditorGUILayout.LabelField("Name", _parameterHeaderStyle, GUILayout.MaxWidth(40f));
                if (_editedNames.Contains(i))
                {
                    parameterNameProperty.stringValue = EditorGUILayout.TextField(parameterNameProperty.stringValue, GUILayout.Width(175f));
                    var ev = Event.current;
                    if (ev.type == EventType.MouseDown || ev.type == EventType.Ignore || (ev.type == EventType.KeyDown && ev.keyCode == KeyCode.Return))
                    {
                        _editedNames.Remove(i);
                    }
                }
                else
                {
                    EditorGUILayout.LabelField(parameterNameProperty.stringValue, _nameStyle, GUILayout.Width(175f));
                }
                EditorGUILayout.LabelField("Type", _parameterHeaderStyle, GUILayout.MaxWidth(40f));
                parameterTypeProperty.enumValueIndex = EditorGUILayout.Popup(parameterTypeProperty.enumValueIndex,
                                                                             parameterTypeProperty.enumDisplayNames,
                                                                             GUILayout.Width(75f));
                GUILayout.Space(20f);
                EditorGUILayout.LabelField("DefaultValue", _parameterHeaderStyle, GUILayout.Width(85f));
                switch (parameterTypeProperty.enumValueIndex)
                    {
                        case 0:
                            {
                                if (!float.TryParse(parameterDefaultValueProperty.stringValue, out float value))
                                {
                                    value = default;
                                }
                                value = EditorGUILayout.FloatField(value, GUILayout.ExpandWidth(true));
                                parameterDefaultValueProperty.stringValue = value.ToString();
                            }
                            break;
                        case 1:
                            {
                                if (!int.TryParse(parameterDefaultValueProperty.stringValue, out int value))
                                {
                                    value = default;
                                }
                                value = EditorGUILayout.IntField(value, GUILayout.ExpandWidth(true));
                                parameterDefaultValueProperty.stringValue = value.ToString();
                            }
                            break;
                        case 2:
                            parameterDefaultValueProperty.stringValue = EditorGUILayout.TextField(parameterDefaultValueProperty.stringValue, GUILayout.ExpandWidth(true));
                            break;
                        case 3:
                            {
                                if (!bool.TryParse(parameterDefaultValueProperty.stringValue, out bool value))
                                {
                                    value = default;
                                }
                                value = EditorGUILayout.Toggle(value, GUILayout.ExpandWidth(true));
                                parameterDefaultValueProperty.stringValue = value.ToString();
                            }
                            break;
                    }
                if (GUILayout.Button("-", GUILayout.MaxWidth(25f), GUILayout.MaxHeight(18f)))
                {
                    if (_editedNames.Contains(i))
                    {
                        _editedNames.Remove(i);
                    }
                    parametersProperty.DeleteArrayElementAtIndex(i);
                }
                EditorGUILayout.EndHorizontal();
            }
        }
    }
}

Пояснять код сильно не буду, здесь в целом все просто. Отмечу только, что редактор позволяет редактировать по выбору все ассеты типа Setting. Для этого при открытии окна мы находим их в проекте с помощью метода AssetDatabase.FindAssets(«t:{0}».Fmt(typeof(Setting).Name)). А также редактирование имени параметра сделано через кнопку для того, чтобы исключить его случайное изменение.

Вот так выглядит редактор:

image

Мы рассмотрели настройки, используемые внутри приложения, теперь рассмотрим более специфичный случай.

Внешние настройки

Представим себе ситуацию, что в уже запущенной игре, нам вдруг понадобилось изменить некие значения, чтобы скорректировать игровой процесс. В примитивном варианте, мы это изменяем в билде, накапливаем такие изменения, делаем обновление и отправляем в магазины, после чего ждем подтверждения и т.п. Но как бы с теми, кто не обновит приложение? И что, если изменения нужно внести срочно? Для решения этой задачи существует такой механизм как Remote Settings. Это не новое изобретение и используется во многих сторонних SDK для аналитики и т.п., например — это есть в Firebase, в GameAnalytics, а также в Unity Analytics. Именно последнее мы и будем использовать.

Примечание: в целом разницы между всеми этими системами нет, они схожи и используют одинаковые принципы.

Остановимся подробнее на том, что же такое Remote Settings в Unity Analytics и что он умеет.

Для того, чтобы данный функционал стал доступен в проекте, необходим включить аналитику в проекте на вкладке Services.

image

После этого необходимо зайти в свой аккаунт Unity3d и найти там свой проект и перейти по ссылке в раздел аналитики, где слева в меню выбираем пункт Remote Settings.

image

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

image

Для добавления параметра выбираем соответствующий пункт и вводим имя, тип и значение параметра.

image

После того, как мы добавили все нужные параметры, нам необходима поддержка в коде, для работы с ними.

Примечание: кнопка Sync осуществляет синхронизацию параметров с приложением. Этот процесс не происходит мгновенно, однако в момент, когда параметры в приложении обновятся, будут вызваны соответствующие события, о них мы поговорим позже.

Для работы с Remote Settings не требуется каких-либо дополнительных SDK, достаточно включить аналитику, о чем я писал выше.

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

public sealed class RemoteSetting : Setting
{
    public IList<string> GetUpdatedParameter()
    {
        var updatedParameters = new List<string>();
        for (var i = 0; i < Parameters.Length; i++)
        {
            var parameter = Parameters[i];
            switch (parameter.ParameterType)
            {
                case ParameterTypeEnum.Float:
                    {
                        var currentValue = Get<float>(parameter.Name);
                        var newValue = RemoteSettings.GetFloat(parameter.Name, currentValue);
                        if (currentValue != newValue)
                        {
                            settingParameters[parameter.Name] = newValue;
                            updatedParameters.Add(parameter.Name);
                        }
                    }
                    break;
                case ParameterTypeEnum.Int:
                    {
                        var currentValue = Get<int>(parameter.Name);
                        var newValue = RemoteSettings.GetInt(parameter.Name, currentValue);
                        if (currentValue != newValue)
                        {
                            settingParameters[parameter.Name] = newValue;
                            updatedParameters.Add(parameter.Name);
                        }
                    }
                    break;
                case ParameterTypeEnum.String:
                    {
                        var currentValue = Get<string>(parameter.Name);
                        var newValue = RemoteSettings.GetString(parameter.Name, currentValue);
                        if (string.Compare(currentValue, newValue, System.StringComparison.Ordinal) != 0)
                        {
                            settingParameters[parameter.Name] = newValue;
                            updatedParameters.Add(parameter.Name);
                        }
                    }
                    break;
                case ParameterTypeEnum.Bool:
                    {
                        var currentValue = Get<bool>(parameter.Name);
                        var newValue = RemoteSettings.GetBool(parameter.Name, currentValue);
                        if (currentValue != newValue)
                        {
                            settingParameters[parameter.Name] = newValue;
                            updatedParameters.Add(parameter.Name);
                        }
                    }
                    break;
            }
        }
        return updatedParameters;
    }
    protected override object GetValue<T>(string paramName, T defaultValue)
    {
        switch(defaultValue)
        {
            case float f:
                return RemoteSettings.GetFloat(paramName, f);
            case int i:
                return RemoteSettings.GetInt(paramName, i);
            case string s:
                return RemoteSettings.GetString(paramName, s);
            case bool b:
                return RemoteSettings.GetBool(paramName, b);
            default:
                return default;
        }
    }
}

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

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

Код менеджера настроек

public class SettingsManager : MonoBehaviourSingleton<SettingsManager>
{
    public Setting this[string index] => GetSetting(index);
    [SerializeField] private Setting[] _settings;
    private readonly IDictionary<string, Setting> _settingsByName = new Dictionary<string, Setting>();
    public void ForceUpdate()
    {
        RemoteSettings.ForceUpdate();
    }
    private void Start()
    {
        foreach(var setting in _settings)
        {
            _settingsByName.Add(setting.name, setting);
        }
        RemoteSettings.BeforeFetchFromServer += OnRemoteSettingBeforeUpdate;
        RemoteSettings.Updated += OnRemoteSettingsUpdated;
        RemoteSettings.Completed += OnRemoteSettingCompleted;
    }
    private Setting GetSetting(string name)
    {
        if(_settingsByName.ContainsKey(name))
        {
            return _settingsByName[name];
        }else
        {
            Debug.LogWarningFormat("[SettingManager]: setting name [{0}] not found", name);
            return null;
        }
    }
    private void OnRemoteSettingBeforeUpdate()
    {
        RemoteSettingBeforeUpdate.Call();
    }
    private void OnRemoteSettingsUpdated()
    {
        foreach (var setting in _settingsByName.Values)
        {
            if (setting is RemoteSetting)
            {
                var updatedParameter = remoteSetting.GetUpdatedParameter();
                foreach (var parameterName in updatedParameter)
                {
                    RemoteSettingUpdated.Call(parameterName);
                }
            }
        }
    }
    private void OnRemoteSettingCompleted(bool wasUpdatedFromServer, bool settingsChanged, int serverResponse)
    {
        RemoteSettingsCompleted.Call(wasUpdatedFromServer, settingsChanged, serverResponse);
    }
    private void OnDestroy()
    {
 RemoteSettings.BeforeFetchFromServer -= OnRemoteSettingBeforeUpdate;
        RemoteSettings.Updated -= OnRemoteSettingsUpdated;
        RemoteSettings.Completed -= OnRemoteSettingCompleted;
    }
}

Менеджер представлен в виде сиглетона, который живет только в сцене. Это сделано для простоты обращения к нему и для того, чтобы можно было легко управлять набором параметров в каждой сцене (исключить параметры, которые не требуются по логике).

Как видно у RemoteSettings есть три события:

  1. Событие, вызываемое перед тем, как будут получены значения параметров с удаленного сервера
  2. Событие обновления параметров (вызывается как раз по кнопке Sync, о которой мы писали ранее), а также в случае принудительного обновления параметров через функцию ForceUpdate
  3. Событие вызываемое, когда с сервера будут получены данные о удаленных настройках. Здесь также выдается код ответа сервера, в случае если произойдет какая-либо ошибка.

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

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

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

public class MyLogic : MonoBehaviour
{
    private const string INGAME_PARAMETERS = "IngamgeParameters";
    private const string REMOTE_RAPAMETERS = "RemoteParamteters";
    private string _localStrValue;
    private int _localIntValue;
    private float _localFloatValue;
    private bool _localBoolValue;
    private string _remoteStrValue;
    private int _remoteIntValue;
    private float _remoteFloatValue;
    private bool _remoteBoolValue;
    private void Start()
    {
        var ingameParametes = SettingsManager.Instance[INGAME_PARAMETERS];
        var remoteParametes = SettingsManager.Instance[REMOTE_RAPAMETERS];
        _localStrValue = ingameParametes.GetParameterValue<string>("MyStr");
        _localIntValue = ingameParametes.GetParameterValue<int>("MyInt");
        _localFloatValue = ingameParametes.GetParameterValue<float>("MyFloat");
        _localBoolValue = ingameParametes.GetParameterValue<bool>("MyBool");
        _remoteStrValue = remoteParametes.GetParameterValue<string>("MyStr");
        _remoteIntValue = remoteParametes.GetParameterValue<int>("MyInt");
        _remoteFloatValue = remoteParametes.GetParameterValue<float>("MyFloat");
        _remoteBoolValue = remoteParametes.GetParameterValue<bool>("MyBool");
    }
}

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

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

Заключение

В данной статье я постарался показать, как можно просто конфигурировать приложение написанное на Unity3d используя, как внутренние настройки, так и удаленные. Аналогичный подход я использую в своих проектах, и он доказывает свою эффективность. Нам даже удалось, используя удаленные настройки реализовать свою систему A/B тестирования. Помимо этого, настройки повсеместно применяются для хранения различных констант связанных с SDK, с серверными вещами, а также с настройкой игрового процесса и т.п. Гейм-дизайнер может заранее создать набор параметров и описать как, и для чего, и где они используются, при этом он может настраивать игровой процесс не блокируя сцену. А за счет того, что мы использовали ScriptableObject и храним такие параметры как ассеты, их можно загружать через AssetBundle, что еще более расширяет нам возможности.

Ссылки указанные в статье:

habr.com/ru/post/282524
assetstore.unity.com/packages/add-ons/services/analytics/unity-analytics-remote-settings-89317

Source: habr1

Метки:





Запись опубликована: 18.01.2019

1 февраля 2019 года ваш сайт может перестать работать

Cisco
Cisco – мировой лидер в области сетевых технологий

Cisco является одним из крупнейших DNS-провайдеров в мире, предоставляя услугу безопасного DNS на базе Cisco Umbrella (ранее OpenDNS), но речь сегодня пойдет не о ней и даже не о безопасности. Дело в том, что 1-го февраля наступит так называемый DNS Flag Day, после которого ваш сайт может быть недоступен пользователям в Интернет.

С 1-го февраля будет недоступен сайт НКЦКИ ФСБ

О чем идет речь? Протокол DNS был разработан в начале 80-х годов. С тех пор много воды утекло и в протокол DNS понадобилось добавить новые функции и возможности. Такая работа была начала в 1999 году, когда в виде RFC 2671 была опубликована первая версия расширений под названий EDNS0 (Extension Mechanism for DNS). Данная версия позволила снять некоторые ограчения, например, на размер некоторых полей флагов, кодов возврата и т.п. Текущая версия расширенного протокола EDNS описана в RFC 6891. При этом в Интернет продолжали существовать DNS-сервера, которые не поддерживали и не поддерживают EDNS, создавая тем самым определенные сложности при взаимодействии, необходимости обеспечивать обратную совместимость, что в свою очередь приводит как к замедлению работу всей системы DNS, так и к невозможности в полной мере реализовать все новые возможности EDNS.

Но этой вакханалии пришел конец — с 1-го февраля неподдерживающие стандарт EDNS сервера будут недоступны и попасть на них будет невозможно. Будут внесены изменения в самое популярное ПО, отвечающее за работу DNS — Bind, Knot Resolver, PowerDNS и Unbound, которое будет принимать только соответствующий стандарту EDNS трафик. Трафик со старых и необновленных серверов будет рассматриваться как нелегитимный и эти сервера обслуживаться не будут, что может привести к недоступности доменов, которые «висят» на этих серверах.

Для большинства компаний DNS Flag Day пройдет незамеченным, так как многие DNS-провайдеры уже обновляют или обновили свое ПО до необходимых версий. Сложности могут возникнуть у тех компаний, кто самостоятельно поддерживает собственные DNS-сервера, а также многих госорганов, которые не слишком оперативно обновляют ПО в своей инфраструктуре, не имея на это либо средств, либо квалифицированных специалистов. В результате с 1-го февраля сайты многих ведомств могут стать недоступны или столкнуться с проблемами с доступом.

Сайт Роскомнадзора

Проверить перспективы доступа к своему сайту в феврале 2019-го года достаточно просто — надо всего лишь зайти на сайт dnsflagday.net, ввести там имя своего домена и получить результат, который будет иметь разные значения. В идеале вы должны увидеть картинку, аналогичную той, которая показана ниже для сайта cisco.ru:

image

Если вы видите картинку, аналогичную той, которая выдается, например, для сайта АНО «Цифровая экономика», то это означает, что сайт работать будет, но он не поддерживает последний стандарт DNS и не сможет в полном объеме реализовать необходимые функции безопасности и может стать мишенью для хакеров, которые могут (а вдруг) атаковать этот сайт.

image

Первые две картинки из этой заметки с красными знаками дорожного движения — это самое плохое, что вы можете увидеть. Лучше поскорее обновить ПО, обеспечивающее работу вашего DNS. На сайте dnsflagday.net вы можете получить все необходимые инструкции и ссылки для того, что актуализировать свое ПО. Там же есть ссылки и на различные утилиты для администраторов, которые позволяют сканировать свою DNS-инфраструктуру в поисках слабых мест.

В завершение заметки я не могу не коснуться вопросов безопасности. Дело в том, что некоторые межсетевые экраны могут блокировать DNS-пакеты длиной более 512 байт (с расширениями EDNS), что может приводить к реализации DoS-атак (например, МСЭ может блокировать DNS cookies, которые являются частью EDNS и предназначены как раз для защиты от DoS-атак) и снижению скорости в Интернет. Поэтому стоит обратить внимание на правила ваших МСЭ, так как раньше это было достаточно распространено и многие уже просто забыли, когда и зачем добавлялись правила в свои средства сетевой периметровой безопасности.

До наступления DNS Flag Day остается меньше двух недель — еще достаточно времени на то, чтобы начать соответствовать стандарту и не снижать лояльность клиентов и граждан, которые, столкнувшись с недоступностью или замедленной работой вашего сайта, начнут нелицеприятно высказываться об этом в соцсетях.

Теги:

Source: habr1

Метки:





Запись опубликована: 18.01.2019

Изучаем Adversarial Tactics, Techniques & Common Knowledge (ATT@CK). Часть 7

Ссылки на все части:

Часть 1. Получение первоначального доступа (Initial Access)
Часть 2. Выполнение (Execution)
Часть 3. Закрепление (Persistence)
Часть 4. Повышение привилегий (Privilege Escalation)
Часть 5. Обход защиты (Defense Evasion)
Часть 6. Получение учетных данных (Credential Access)
Часть 7. Обнаружение (Discovery)

Получив, в результате первичной компрометации, доступ в систему противник должен «осмотреться», понять что он теперь контролирует, какие возможности у него появились и достаточно ли текущего доступа для достижения тактической или конечной цели. Этот этап атаки называется «Обнаружение» (англ. Discovery — «научной открытие», «раскрытие», «разоблачение»).

Автор не несет ответственности за возможные последствия применения изложенной в статье информации, а также просит прощения за возможные неточности, допущенные в некоторых формулировках и терминах. Публикуемая информация является свободным пересказом содержания MITRE ATT&CK.

Операционные системы имеют множество встроенных инструментов с помощью которых противник может осуществлять исследование внутреннего периметра атакуемой сети после её компрометации. В Windows для сбора информации могут использоваться инструменты прямого взаимодействия с Windows API, функционал WMI и PowerShell.

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

В качестве меры, направленной на выявление вышеописанной активности в защищаемых системах, рекомендован мониторинг процессов и аргументов командной строки, которые могут использоваться в ходе сбора информации о системе или сети. Общей рекомендацией по предотвращению возможности несанкционированного внутреннего исследования защищаемой системы и сети является проведение аудита наличия ненужных системных утилит и потенциально-опасного ПО, которые могут использоваться для изучения защищаемой среды, и применение инструментов блокирования их запуска, например AppLocker или политик ограничения программного обеспечения (Software Restriction Policies).

Система: Windows, Linux, macOS
Права: Пользователь
Описание: Злоумышленники могут пытаться получить перечень учетных записей локальной системы или домена.

Windows
Для получения информации об учетных записях могут быть использованы утилиты Net или Dsquery:
net user
net group
net localgroup
dsquery user
dsquery group

Злоумышленник может применять техники обнаружения владельца/пользователя системы (System Owner/User Discovery) для поиска основного пользователя, текущего пользователя системы или группы пользователей, которые обычно используют систему.

Mac
В Mac, группы пользователей могут быть получены с помощью команд groups и id. Также группы пользователей и пользователи могут быть перечислены с помощью следующих команд:
dscl . list /Groups
dscacheutile -q group

Linux
В Linux, локальные пользователи могут быть получены из файла /etc/passwd, который доступен для чтение всем пользователям. В Mac этот же файл используется только в однопользовательском режиме в дополнение к файлу /etc/master.passwd. Кроме того, в Linux также доступны команды groups и id.

Рекомендации по защите: Предотвратите возможность перечисления учетных записей администраторов при повышении уровня прав через UAC, поскольку это приведёт к раскрытию имен учетных записей администраторов. Соответствующий раздел реестра можно отключить с помощью GPO:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesCredUI
EnumerateAdministrators

GPO: Computer Configuration > [Policies] > Administrative Templates > Windows Components > Credential User Interface: Enumerate administrator accounts on elevation.

Система: Windows, macOS
Права: Пользователь
Описание: Злоумышленники могут пытаться получить списки окон, открытых приложениями. Такие списки могут свидетельствовать о там как используется система или обнаружить контекст собранной кейлоггером информации. В Mac это можно сделать с помощью небольшого скрипта на AppleScript.

Система: Windows, Linux, macOS
Права: Пользователь
Описание: Чтобы узнать о скомпрометированной системе как можно больше информации злоумышленники могут изучать пользовательские закладки браузера. Закладки могут раскрывать личную информацию о пользователях (например, банковские сайты, личные интересы, социальные сети и т.п.), а также информацию о внутренних сетевых ресурсах сети — серверах, инструментах, дашбордах и других инфраструктурных элементах. Противник может использовать учетные данные, закэшированные в браузере, для получения доступа к сервисам пользователя, адреса которых сохранены в закладках браузера. Места хранения закладок зависят от платформы и специфики приложений и ОС. Закладки браузера, как правило, хранятся в виде локальных файлов или баз данных.

Рекомендации по защите: Учитывая, что хранение информации в файлах является штатной функцией ОС, попытки подавления этой активности будут неуместны. Например, ограничение доступа к файлам закладок браузера, скорее всего, приведет к непреднамеренным побочных эффектам и нарушит работу легитимного ПО. Усилия по защите необходимо направить на предотвращение запуска средств и инструментов злоумышленника на более ранних стадиях атаки.

Система: Windows, Linux, macOS
Права: Пользователь, администратор, System
Описание: Злоумышленники могут перечислять файлы и каталоги или искать определенную информацию в конкретных локациях на хосте или на общих сетевых ресурсах.

Windows
Примерами утилит для получения информации о файлах и каталогах служить dir и tree. Пользовательские инструменты посредством прямого взаимодействия с Windows API могут также использоваться для сбора информации о файлах и каталогах.

Linux и macOS
В Linux и macOS обзор файлов и каталогов осуществляется с помощью команд ls, find и locate.

Рекомендации по защите: Учитывая, что представление информации в виде файлов и каталогов является штатной функцией ОС, попытки подавления этой активности будут неуместны. Усилия по защите необходимо направить на предотвращение запуска средств и инструментов злоумышленника на более ранних стадиях атаки.

Система: Windows, Linux, macOS
Права: Администратор, System
Описание: Злоумышленники могут пытаться получить список служб, запущенных на удаленных хостах, включая те, которые могут быть уязвимы для средств удаленного доступа. Методы получения такой информации включают в себя сканирование портов и уязвимостей с помощью инструментов, которые загружаются в систему.

Рекомендации по защите: Применяйте IDS/IPS-системы для обнаружения и предотвращения удаленного сканирования. Убедитесь, что ненужные порты закрыты, неиспользуемые службы отключены, а правильная сегментация сети соблюдается для защиты критично-важных серверов и устройств.

Система: Windows, macOS
Права: Пользователь
Описание: В локальных сетях часто есть общие сетевые диски и папки, которые позволяют пользователям получать по сети доступ к файловым каталогам, размещенным в различных системах. Злоумышленники могут искать общие сетевые папки и диски в удаленных системах в целях поиска целевых источников данных и выявления потенциальных систем для дальнейшего продвижения по сети.

Windows
Обмен файлами в Windows-сетях осуществляется с помощью протокола SMB. Утилита Net может быть использована для получения от удаленной системы информации о наличии в ней общих сетевых дисков: net view remotesystem
Или получения информации об общих сетевых дисках в локальной системе: net share.

Mac
В Mac, локально-примонтированные общие сетевые ресурсы можно просмотреть с помощью команды: df -aH.

Система: Windows, Linux, macOS
Описание: Злоумышленник может использовать сетевой интерфейс в режиме promiscuos mode («неразборчивый» режим), в котором сетевая плата будет принимать все пакеты независимо от того кому они адресованы или использовать span-порты (порты зеркалирования) для захвата большого объема данных, передаваемых по проводным или беспроводным сетям.

Захваченные в ходе сниффинга данные могут содержать учетные данные, отправленные через незащищенные соединения без использования протоколов шифрования. Различные атаки на сетевые службы имен типа отравления LLMNR/NBT-NS путем перенаправления трафика также могут использоваться для сбора учетных данных на веб-сайтах, прокси-серверах и внутренних системах. В ходе прослушивание сети противник так же может выявить различные сведения о конфигурации (запущенные службы, номера версий, IP-адреса, имена хостов, VLAN ID и т.п.) необходимые для дальнейшего продвижения по сети и/или обхода средств защиты.

Рекомендации по защите: Убедитесь, что беспроводной трафик соответствующим образом зашифрован. По возможности, используйте Kerberos, SSL и многофакторную аутентификацию. Проводите мониторинг сетевых коммутаторов на предмет использования span-портов, отравления ARP/DNS и несанкционированных изменений конфигурации маршрутизатора. Применяйте средства выявления и блокировки потенциально-опасного ПО, которое может быть использовано для перехвата и анализа сетевого трафика.

Система: Windows, Linux, macOS
Права: Пользователь
Описание: Парольная политика в сети — это способ гарантированного применения пользователями сложных паролей, которые трудно угадать или взломать путем перебора. Злоумышленник может пытаться получить доступ к информации о параметрах парольной политики атакуемой сети в целях создания списка распространенных общеизвестных паролей, удовлетворяющих требованиям политики (например, если политикой установлена минимальная длина паролей в 8 символов, то не пытаться использовать пароли типа pass123 или не проверять более 3-4х паролей на учетную запись, если количество неудачных попыток равно 6) и последующего запуска подбора паролей по словарю. Парольные политики могут применяться и быть обнаруженными как в Windows, так и в Linux и macOS.

Windows
net accounts
net accounts /domain

Linux
chage -l
cat /etc/pam.d/comman-password

macOS
pwpolicy getaccountpolicies

Рекомендации по защите: Попытки прямого воспрепятствования выявлению парольной политики не рекомендуются, поскольку параметры парольной политики должны быть известны всем системам и пользователям сети. Убедитесь, что применяемая вами парольная политика затрудняет брутфорс паролей и не позволяет использовать слишком легкие пароли. Самый распространенный способ применения парольной политики в корпоративной сети — это внедрение Active Directory.

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

Система: Windows
Права: Пользователь, Администратор, System
Описание: Злоумышленники могут пытаться собрать информацию о подключенных к компьютерам в атакуемой сети периферийных устройствах. Эта информация может быть использована для повышения осведомленности об атакуемой среде и в использована при планировании дальнейших вредоносных действий.

Система: Windows, Linux, macOS
Права: Пользователь
Описание: Злоумышленники могут пытаться найти локальные или доменные группы доступа и исследовать параметры их разрешений.

Windows
Перечислить группы доступа можно с помощью утилиты Net:
net group /domain
ner localgroup

Linux
В Linux локальные группы можно перечислять с помощью команды groups, доменные — с помощью команды ldapsearch.

macOS
В Mac тоже самое можно сделать с помощью следующих команд:
dscacheutil -q — для доменных групп;
dscl . -list /Groups — для локальных групп.

Система: Windows, Linux, macOS
Права: Пользователь, Администратор, System
Описание: Противники могут пытаться получить информацию о запущенных с системе процессах с целью получения сведений о программном обеспечении, работающем на системах атакуемой сети.

Windows
Примером способа получения сведений о процессах в Windows является системная утилита Tasklist.

Mac и Linux
В Mac и Linux это выполняется с помощью команды ps.

Система: Windows
Права: Пользователь, администратор, System
Описание: Злоумышленники могут взаимодействовать с реестром Windows для сбора информации о системе, конфигурации и установленном ПО. Реестр содержит значительный объем информации об операционной системе, конфигурации, программном обеспечении и безопасности. Некоторая информация может помочь противнику в проведении дальнейших операций в атакуемой сети. Взаимодействие с реестром может происходить с использованием различных утилит, например, Reg или при помощи запуска сторонних инструментов, использующих Windows API.

Система: Windows, Linux, macOS
Права: Пользователь, Администратор, System
Описание: Противник, вероятно, попытается получить список систем в атакуемой сети. Обнаружить удаленные системы можно по IP-адресу, имени хоста или другому идентификатору, который в дальнейшем может использоваться для продвижения злоумышленника по сети из текущей системы. Соответствующие функциональные возможности могут быть включены в инструменты удаленного доступа (RAT), также могут быть использованы и встроенные системные утилиты.

Windows
Команды ping или net view.

Mac
Для обнаружения Mac-систем в пределах широковещательного домена (broadcast domain) применяется протокол Bonjour. Такие утилиты как ping также могут использоваться для сбора информации об удаленных системах.

Linux
Такие утилиты как ping также могут использоваться для сбора информации об удаленных системах.

Система: Windows, macOS
Права: Пользователь, администратор, System
Описание: Злоумышленники могут попытаться получить списки программных средств обеспечения безопасности, конфигураций, датчиков, установленных в системе. Целью противника могут быть такие вещи как локальные правила брандмауэра, антивирус и средства виртуализации. Эти проверки могут быть встроены в инструменты удаленного доступа (RAT), используемые на ранних стадиях атаки.

Windows
Примерами команд, которые могут использоваться для получения сведений о средствах безопасности, являются утилиты netsh, reg query, dir и tasklist, однако могут применятся и другие более специфичные инструменты, предназначенные на выявление определенных систем безопасности, которые ищет противник.

Mac
Распространенным способом проверки на вредоносные программы является использование программ LittleSnitch и KnockKnock.

Система: Windows, Linux, macOS
Права: Пользователь
Описание: Противник может попытаться получить подробную информацию об операционной системе и оборудовании, включая архитектуру, версию, исправления и установленные пакеты обновлений.

Windows
Примерами утилит для получения сведений о системе являются ver, systeminfo и dir для идентификации сведений о системе на основе существующих файлов и каталогов.

Mac
Команда systemsetup выдаёт подробную информацию о системе, но она требует административных привилегий. Кроме того, подробную разбивку конфигураций, правил брандмауэра, подключенных томов, оборудования и многих других вещей без необходимости повышения привилегий выдаёт system_profiler.

Система: Windows, Linux, macOS
Права: Пользователь
Описание: Злоумышленник, вероятнее всего, будет искать подробные сведения о сетевой конфигурации и параметрах систем к которым он имеет доступ или через исследование удаленных систем. Некоторые утилиты, предназначенные для администрирования операционной системы, могут использоваться для сбора вышеуказанной информации. Примеры таких утилит: arp, ipconfig/ifconfig, nbtstat, route, tracert/tracerout и т.п.

Система: Windows, Linux, macOS
Права: Пользователь, администратор
Описание: Злоумышленники могут пытаться получить список входящих и исходящих сетевых подключений компрометированной системы, к которой они имеют доступ, или удаленной системы, запрашивая информацию по сети.

Windows
Утилиты и команды для получения сведений о сетевых подключениях:
Netstat
net use
net session

Mac и Linux
Для отображения текущих соединений могут использоваться netstat и lsof. По аналогии с «net session«, утилиты who и w могут отображать текущих пользователей, вошедших в систему.

Система: Windows, Linux, macOS
Права: Пользователь, администратор
Описание: Злоумышленники могут пытаться идентифицировать основного пользователя системы, текущего пользователя, зарегистрированного в данный момент, группу пользователей, которые обычно используют систему или определить на сколько активно пользователь использует систему. Противник может получать вышеуказанные сведения путем методов выявления учетных записей (см. технику «Обнаружение учетных записей») или используя методы Дампинга учетных данных. Сведения о пользователе и его имени распространены во всей системе — включены в информацию о владельцах процессов, файлов и каталогов, в информацию о сеансах и системные журналы, поэтому противник может применять различные методы обнаружения.
В Maс, текущий пользователь может быть идентифицирован с помощь утилит users, w и who. В linux-системах — только с помощью w и who.

Система: Windows
Права: Пользователь, администратор, System
Описание: Злоумышленник может пытаться получить информацию о зарегистрированных службах. Для сбора данных противник может использовать различные инструменты, в том числе встроенные утилиты, которые могут получать сведения о службах:
sc
tasklist /svc
net start

Система: Windows
Права: Пользователь
Описание: Системное время устанавливается в домене и хранится Службой времени (Windows Times Service) для обеспечения синхронизации времени между системами и сервисами в сети предприятия. Злоумышленник может получить системное время и/или часовой пояс из локальной или удаленной системы. Эта информация может быть собрана несколькими способами:
net time hostname — получение системного времени хоста;
w32tm /tz — получение часового пояса.
Информация о системном времени может быть полезна для применения противником различных методов атак, таких как выполнения файла с запланированной задачей или, основываясь на сведениях о часовом поясе, для раскрытия местоположения жертвы.

Рекомендации по защите: Доброкачественное ПО использует легитимные процессы для сбора системного времени. Усилия по защите необходимо направлять на предотвращение выполнения нежелательного или неизвестного кода в системе. В целях предотвращения несанкционированного получения сведений о времени с удаленной системы такие инструменты как утилита Net могут быть заблокированы политикой безопасности. Мониторинг командной строки может быть полезен для обнаружения экземпляров Net.exe или других утилит, используемых для сбора системного времени и часового пояса. Мониторинг вызовов API в данных целях менее полезен из-за того, что API часто используется законным программным обеспечением.

Теги:

Похожие публикации

Source: habr1

Метки:





Запись опубликована: 18.01.2019

8 ярких цветовых трендов 2019 года

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

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

Содержание статьи

1. Огненно-красный
2. Белый/Сероватый
3. Природные цвета
4. Меньше = больше
5. Яркие контрасты
6. Чем больше, тем веселее
7. Радужные палитры
8. Живой коралл — цвет 2019 года по версии Pantone
Вместо заключения

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

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

Ознакомиться с полной версией лендинга>>>

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

А учитывая, что пустое пространство (white space) — основной ингредиент минималистичного стиля, белый цвет идеально подходит для современных и элегантных брендов. Он всегда будет сочетаться с другими цветами на посадочной странице (обычно нейтральными).

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

Ознакомиться с полной версией лендинга>>>

3. Природные цвета

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

Ознакомиться с полной версией лендинга>>>

4. Меньше = больше

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

Ознакомиться с полной версией лендинга>>>

5. Яркие контрасты

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

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

Контрастность достигается путем сочетания не только двух противоположных оттенков, но также узоров и теней. Все это формирует довольно динамичную и яркую композицию.

На лендинге ниже удачно сочетаются два противоположных цвета — насыщенный теплый желтый и глубокий темно-синий:

Ознакомиться с полной версией лендинга>>>

6. Чем больше, тем веселее

Дизайнеры используют цвета благодаря их способности вдохнуть жизнь в любой лендинг. И если в прошлом главным советом было избегать сверхсложных цветовых комбинаций — то в 2019 вы можете экспериментировать как только вашей душе угодно.

Однако не стоит смешивать цвета случайным образом. Чтобы создать гармоничную композицию, важно быть предельно внимательными и осторожными. Например, можно «поиграть» с насыщенностью/яркостью какого-то одного оттенка, либо же равномерно увеличить яркость всех оттенков для более гармоничной и сдержанной палитры.

Ознакомиться с полной версией лендинга>>>

7. Радужные палитры

Высококонтрастная или суперкрасочная палитра отлично подойдет для дерзкого дизайна. Тем не менее бывают случаи, когда есть потребность в чем-то более легком и фееричном, и тогда вам стоит обратить свое внимание на данный цветовой тренд.

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

Ознакомиться с полной версией лендинга>>>

8. Живой коралл — цвет 2019 года по версии Pantone

Похоже, что в наступившем году мы будем часто видеть этот цвет: Живой коралл Pantone 16-1546. Этот яркий, но при этом мягкий оттенок оранжевого, вызывает ощущение тепла, уюта и радости.

«Отражая сложный синтез нашей современной жизни, Живой коралл Pantone – полный заботы цвет, который можно найти в нашем естественном окружении и который, в то же время, имеет живое присутствие в социальных сетях», — Pantone.

В примере ниже коралловый различной степени насыщенности использован в качестве одного из основных цветов лендинга, а его сочетание с мятным и фиолетовыми оттенками создает ощущение сказки:

Ознакомиться с полной версией лендинга>>>

Вместо заключения

Как вы могли заметить, 2019 год принес нам всего понемногу. Неважно, любите вы супер яркие или предпочитаете нейтральные, пастельные оттенки, классический или современный стиль — вам будет из чего выбрать.

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

Высоких вам конверсий! 

По материалам: 99designs.com

Иллюстрация к статье: Психология цвета в маркетинге: обзор 9 популярных оттенков
Иллюстрация к статье: Яркие цветовые решения для приложений и сайтов
Иллюстрация к статье: 6 цветов, которые гарантированно увеличивают продажи
Иллюстрация к статье: Почему свадебное платье белого цвета?
Иллюстрация к статье: 23 эффективных цветовых решения интернет-магазинов
Иллюстрация к статье: Теория цвета: 7 уроков на примере популярных брендов

Source: LpGenerator

Метки: