Мы уже узнали о системах Debian и Ubuntu. В этой статье я покажу минимальный процесс установки операционной системы Ubuntu 22.04.
Архив рубрики: Публикации
Компания Cosmochanger.cc: обмен валюты и преимущества
Биткоины или криптовалюта – это современные электронные деньги, которые широко используют для оплаты различных услуг и приобретенных товаров. Такую плату могут просить авиакомпании, туристические агентства, а также отели и гостиницы. Получить биткоины можно на официальном сайте специализированной компании Cosmochanger.cc Читать
Как работать с CSV-файлами в Python
В этой статье будет рассмотрено руководство по работе с файлами «csv» с помощью Python. Термин «csv» означает «значения, разделенные запятыми», где каждая строка или строка содержат текстовые значения, разделенные запятыми. В некоторых случаях для разделения значений вместо запятой также используется «точка с запятой». Однако это не имеет большого значения для правил формата файлов, и логика обработки обоих типов разделителей остается той же.
Формат файла CSV обычно используется для обслуживания баз данных и электронных таблиц. Первая строка в CSV-файле чаще всего используется для определения полей столбцов, а все остальные оставшиеся строки считаются строками. Эта структура позволяет пользователям представлять табличные данные с помощью файлов CSV. Файлы CSV можно редактировать в любом текстовом редакторе. Однако такие приложения, как LibreOffice Calc, предоставляют расширенные инструменты редактирования, сортировки и фильтрации.
Чтение данных из файлов CSV с помощью Python
Модуль CSV в Python позволяет вам читать, записывать и управлять любыми данными, хранящимися в файлах CSV. Чтобы прочитать файл CSV, вам нужно будет использовать метод «reader» из модуля Python «csv», который включен в стандартную библиотеку Python.
Учтите, что у вас есть файл CSV, содержащий следующие данные:
Mango,Banana,Apple,Orange 50,70,30,90
Первая строка файла определяет категорию каждого столбца, в данном случае название фруктов. Во второй строке хранятся значения в каждом столбце (на складе). Все эти значения разделяются запятой. Если бы вы открыли этот файл в приложении для работы с электронными таблицами, таком как LibreOffice Calc, он бы выглядел так:
Теперь, чтобы прочитать значения из файла «fruit.csv» с помощью модуля Python «csv», вам нужно будет использовать метод «reader» в следующем формате:
import csv
with open("fruits.csv") as file:
data_reader = csv.reader(file)
for line in data_reader:
print (line)
Первая строка в приведенном выше примере импортирует модуль «csv». Затем оператор «with open» используется для безопасного открытия файла, хранящегося на вашем жестком диске (в данном случае «fruit.csv»). Новый объект «data_reader» создается путем вызова метода «reader» из модуля «csv». Этот метод «читателя» принимает имя файла в качестве обязательного аргумента, поэтому ему передается ссылка на «fruit.csv». Затем выполняется оператор цикла for для печати каждой строки из файла «fruit.csv». После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:
['50', '70', '30', '90']
Если вы хотите назначить номера строк для вывода, вы можете использовать функцию «перечислить», которая присваивает номер каждому элементу в итерации (начиная с 0, если не было изменено).
import csv
with open("fruits.csv") as file:
data_reader = csv.reader(file)
for index, line in enumerate(data_reader):
print (index, line)
Переменная index хранит счетчик для каждого элемента. После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:
0 ['Mango', 'Banana', 'Apple', 'Orange'] 1 ['50', '70', '30', '90']
Поскольку первая строка в файле «csv» обычно содержит заголовки столбцов, вы можете использовать функцию «перечислить» для извлечения этих заголовков:
import csv
with open("fruits.csv") as file:
data_reader = csv.reader(file)
for index, line in enumerate(data_reader):
if index == 0:
headings = line
print (headings)
Блок «if» в приведенном выше утверждении проверяет, равен ли индекс нулю (первая строка в файле «fruit.csv»). Если да, то значение переменной «строка» присваивается новой переменной «заголовки». После выполнения приведенного выше примера кода вы должны получить следующий результат:
['Mango', 'Banana', 'Apple', 'Orange']
Обратите внимание, что вы можете использовать свой собственный разделитель при вызове метода csv.reader, используя необязательный аргумент «разделитель» в следующем формате:
import csv
with open("fruits.csv") as file:
data_reader = csv.reader(file, delimiter=";")
for line in data_reader:
print (line)
Поскольку в файле csv каждый столбец связан со значениями в строке, вы можете создать объект «словарь» Python при чтении данных из файла «csv». Для этого вам нужно использовать метод «DictReader», как показано в приведенном ниже коде:
import csv
with open("fruits.csv") as file:
data_reader = csv.DictReader(file)
for line in data_reader:
print (line)
После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:
{'Mango': '50', 'Banana': '70', 'Apple': '30', 'Orange': '90'}</cce_text>
So now you have a dictionary object that associates individual columns with their corresponding values in the rows. This works fine if you have only one row. Let's assume that the "fruits.csv" file now includes an additional row that specifies how many days it will take for the stock of fruit to perish.
[cce_text width="100%" height="100%" escaped="true" theme="blackboard" nowrap="0"]Mango,Banana,Apple,Orange
50,70,30,90
3,1,6,4
Если у вас несколько строк, выполнение одного и того же примера кода, приведенного выше, приведет к другому результату.
{'Mango': '50', 'Banana': '70', 'Apple': '30', 'Orange': '90'}
{'Mango': '3', 'Banana': '1', 'Apple': '6', 'Orange': '4'}
Это может быть не идеально, поскольку вы можете сопоставить все значения, относящиеся к одному столбцу, к одной паре ключ-значение в словаре Python. Вместо этого попробуйте этот пример кода:
import csv
with open("fruits.csv") as file:
data_reader = csv.DictReader(file)
data_dict = {}
for line in data_reader:
for key, value in line.items():
data_dict.setdefault(key, [])
data_dict[key].append(value)
print (data_dict)
После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:
{'Mango': ['50', '3'], 'Banana': ['70', '1'], 'Apple': ['30', '6'], 'Orange': ['90', '4']}
Цикл «for» используется для каждого элемента объекта «DictReader» для перебора пар ключ-значение. Перед этим определяется новая переменная словаря Python «data_dict». Он будет хранить окончательные сопоставления данных. Во втором блоке цикла for используется метод setdefault словаря Python. Этот метод присваивает значение ключу словаря. Если пара «ключ-значение» не существует, создается новая из указанных аргументов. Таким образом, в этом случае новый пустой список будет назначен ключу, если он еще не существует. Наконец, «значение» добавляется к соответствующему ключу в конечном объекте «data_dict».
Запись данных в файл CSV
Чтобы записать данные в файл «csv», вам нужно будет использовать метод «writer» из модуля «csv». В приведенном ниже примере к существующему файлу «fruit.csv» будет добавлена новая строка.
import csv
with open("fruits.csv", "a") as file:
data_writer = csv.writer(file)
data_writer.writerow([3,1,6,4])
Первый оператор открывает файл в режиме «добавления», обозначенном аргументом «а». Затем вызывается метод «писателя», и ему передается ссылка на файл «fruit.csv» в качестве аргумента. Метод «writerow» записывает или добавляет новую строку в файл.
Если вы хотите преобразовать словарь Python в файловую структуру «csv» и сохранить вывод в файле «csv», попробуйте этот код:
import csv
with open("fruits.csv", "w") as file:
headings = ["Mango", "Banana", "Apple", "Orange"]
data_writer = csv.DictWriter(file, fieldnames=headings)
data_writer.writeheader()
data_writer.writerow({"Mango": 50, "Banana": 70, "Apple": 30, "Orange": 90})
data_writer.writerow({"Mango": 3, "Banana": 1, "Apple": 6, "Orange": 4})
После открытия пустого файла «fruit.csv» с помощью оператора «with open» определяется новая переменная «заголовки», которая содержит заголовки столбцов. Новый объект «data_writer» создается путем вызова метода «DictWriter» и передачи ему ссылки на файл «fruit.csv» и аргумент «fieldnames». В следующей строке заголовки столбцов записываются в файл с помощью метода «writeheader». Последние два оператора добавляют новые строки к соответствующим заголовкам, созданным на предыдущем шаге.
Заключение
Файлы CSV предоставляют удобный способ записи данных в табличном формате. Встроенный в Python модуль «csv» позволяет легко обрабатывать данные, доступные в файлах «csv», и реализовывать на них дополнительную логику.
MikroTik – статические маршруты.
В нашей организации есть две не связанные локальные сети каждая со своим шлюзом. Была поставлена задача их объединить. О том как это происходило написано далее.
Освоить MikroTik Вы можете с помощью онлайн-куса
«Настройка оборудования MikroTik». Курс содержит все темы, которые изучаются на официальном курсе MTCNA. Автор курса – официальный тренер MikroTik. Подходит и тем, кто уже давно работает с микротиками, и тем, кто еще их не держал в руках. В курс входит 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.
Схема сетей.
В обоих сетях работают роутеры MikroTik RB750Gr3 с прошивкой 6.48.
В первые порты подключены патч-корды внешних сетей.
Во вторые порты подключен патч-корд между двумя роутерами (красный).
В пятые порты подключены патч-корды до коммутаторов ЛВС (синие).

Для понятности описаны подробные настройки для обоих роутеров.
Обозначим роутеры №1 и №2.
Базовые настройки помещены под спойлер.
Подключаемся к роутеру через WinBox из локальной сети. (как это сделать)
Reset Configuration.
Сбрасываем конфигурацию без сохранения настроек по умолчанию. 
Через командную строку терминала:
|
1
| /system reset—configuration no—defaults=yes |
Подключаемся к роутеру по MAC-адресу.
Ports.
Переименуем порты, чтоб не путаться в процессе настройки.
ether1-WAN (внешняя сеть – Интернет)
ether2-ROUTE (роутер №2)
ether3-ether5 – LAN (локальная сеть) 
Через командную строку терминала:
|
1 2 3 4 5
| /interface ethernet set [ find default—name=ether1 ] name=ether1—WAN /interface ethernet set [ find default—name=ether2 ] name=ether2—ROUTE /interface ethernet set [ find default—name=ether3 ] name=ether3—LAN /interface ethernet set [ find default—name=ether4 ] name=ether4—LAN /interface ethernet set [ find default—name=ether5 ] name=ether5—LAN |
Bridge.
Создаем мост для внутренней локальной сети. 
Через командную строку терминала:
|
1
| /interface bridge add name=bridge1 |
Bridge ports.
Добавляем в мост порты ether3-ether5 
Через командную строку терминала:
|
1 2 3
| /interface bridge port add bridge=bridge1 interface=ether3—LAN /interface bridge port add bridge=bridge1 interface=ether4—LAN /interface bridge port add bridge=bridge1 interface=ether5—LAN |
Bridge address.
Назначим мосту статический IP-адрес. 
Через командную строку терминала:
|
1
| /ip address add address=192.168.10.1/24 interface=bridge1 network=192.168.10.0 |
Ether2-ROUTE address.
Назначим статический адрес порту в направлении второго роутера.

Через командную строку терминала:
|
1
| /ip address add address=172.16.0.10/24 interface= ether2—ROUTE network=172.16.10.0 |
DHCP—client.
Создадим получение IP-адреса от вышестоящего роутера (провайдера) в автоматическом режиме.
Создаем DHCP Client соединение.

Через командную строку терминала:
|
1
| /ip dhcp—client add interface=ether1—WAN disabled=no |
DHCP—server для локальной сети.
Создаем пул IP-адресов, которые будут раздаваться автоматически. 
Через командную строку терминала:
|
1
| /ip pool add name=dhcp ranges=192.168.10.10—192.168.10.20 |
Укажем сеть для DHCP-сервера.

Через командную строку терминала:
|
1
| /ip dhcp—server network add address=192.168.10.0/24 gateway=192.168.10.1 dns—server=192.168.10.1 |
Создадим DHCP Server.

Через командную строку терминала:
|
1
| /ip dhcp—server add address—pool=dhcp disabled=no interface=bridge1 lease—time=1h name=dhcp10 |
Привяжем полученный IP-адрес к MAC-адресу ПК пользователя.

Через командную строку терминала:
|
1
| /ip dhcp—server lease add address=192.168.10.10 client—id=1:A1:B2:C3:D4:E5:F6 mac—address=A1:B2:C3:D4:E5:F6 server=dhcp10 |
DNS.
Динамический DNS будет присвоен автоматически, или его можно указать вручную.
Allow Remote Requests – отмечаем галочкой.

Через командную строку терминала:
|
1
| /ip dns set servers=192.168.0.1 allow—remote—requests=yes |
NAT.
NAT masquerade подменяет IP-адреса локальной сети на внешний IP при отправке запросов и обратная ситуация при возвращении ответов.


Через командную строку терминала:
|
1
| /ip firewall nat add chain=srcnat out—interface=ether1—WAN action=masquerade |
После этих действий Интернет заработает в локальной сети.
Для полноценной работы необходимо выполнить настройки по безопасности, и некоторые другие настройки (см.базовая настройка роутера MikroTik).
Routes.
Создадим маршрут от первого до второго роутера. Это можно сделать в меню IP >> Routes.
Через командную строку терминала:
|
1
| /ip route add dst—address=192.168.20.0/24 gateway=172.16.0.20 distance=1 |
Этот маршрут означает что при необходимости попасть в сеть 192.168.20.0/24 будет использован шлюз 172.16.0.20.

Подключаемся к роутеру через WinBox из локальной сети. (как это сделать)
Reset Configuration.
Сбрасываем конфигурацию без сохранения настроек по умолчанию.

Через командную строку терминала:
|
1
| /system reset—configuration no—defaults=yes |
Подключаемся к роутеру по MAC-адресу.
Ports.
Переименуем порты, чтоб не путаться в процессе настройки.
ether1-WAN (внешняя сеть – Интернет)
ether2-ROUTE (роутер №1)
ether3-ether5 – LAN (локальная сеть)

Через командную строку терминала:
|
1 2 3 4 5
| /interface ethernet set [ find default—name=ether1 ] name=ether1—WAN /interface ethernet set [ find default—name=ether2 ] name=ether2—ROUTE /interface ethernet set [ find default—name=ether3 ] name=ether3—LAN /interface ethernet set [ find default—name=ether4 ] name=ether4—LAN /interface ethernet set [ find default—name=ether5 ] name=ether5—LAN |
Bridge.
Создаем мост для внутренней локальной сети.

Через командную строку терминала:
|
1
| /interface bridge add name=bridge1 |
Bridge ports.
Добавляем в мост порты ether3-ether5

Через командную строку терминала:
|
1 2 3
| /interface bridge port add bridge=bridge1 interface=ether3—LAN /interface bridge port add bridge=bridge1 interface=ether4—LAN /interface bridge port add bridge=bridge1 interface=ether5—LAN |
Bridge address.
Назначим мосту статический IP-адрес.

Через командную строку терминала:
|
1
| /ip address add address=192.168.20.1/24 interface=bridge1 network=192.168.20.0 |
Ether2-ROUTE address.
Назначим статический адрес порту в направлении первого роутера.

Через командную строку терминала:
|
1
| /ip address add address=172.16.0.20/24 interface=ether2—ROUTE network=172.16.0.0 |
DHCP—client.
Создадим получение IP-адреса от вышестоящего роутера (провайдера) в автоматическом режиме.
Создаем DHCP Client соединение.

Через командную строку терминала:
|
1
| /ip dhcp—client add interface=ether1—WAN disabled=no |
DHCP—server для локальной сети.
Создаем пул IP-адресов, которые будут раздаваться автоматически.

Через командную строку терминала:
|
1
| /ip pool add name=dhcp ranges=192.168.20.10—192.168.20.20 |
Укажем сеть для DHCP-сервера.

Через командную строку терминала:
|
1
| /ip dhcp—server network add address=192.168.20.0/24 gateway=192.168.20.1 dns—server=192.168.20.1 |
Создадим DHCP Server.

Через командную строку терминала:
|
1
| /ip dhcp—server add address—pool=dhcp disabled=no interface=bridge1 lease—time=1h name=dhcp20 |
Привяжем полученный IP-адрес к MAC-адресу ПК пользователя.

Через командную строку терминала:
|
1
| /ip dhcp—server lease add address=192.168.20.20 client—id=1:A1:B2:C3:D4:E5:F6 mac—address=A1:B2:C3:D4:E5:F6 server=dhcp20 |
DNS.
Динамический DNS будет присвоен автоматически, или его можно указать вручную.
Allow Remote Requests – отмечаем галочкой.

Через командную строку терминала:
|
1
| /ip dns set servers=192.168.1.1 allow—remote—requests=yes |
NAT masquerade.


Через командную строку терминала:
|
1
| /ip firewall nat add chain=srcnat out—interface=ether1—WAN action=masquerade |
После этих действий Интернет заработает в локальной сети.
Не забываем выполнять базовые настройки по безопасности.
Routes.
Создадим маршрут от второго роутера к первому роутера. Переходим в боковом меню в IP >> Routes.

Через командную строку терминала:
|
1
| /ip route add dst—address=192.168.10.0/24 gateway=172.16.0.10 distance=1 |
Этот маршрут означает что при необходимости попасть в сеть 192.168.10.0/24 будет использован шлюз 172.16.0.10.

Настроенная система прошла успешное тестирование. Доступ между сетями может ограничивать антивирус или правила Firewall в роутерах.
Освоить MikroTik Вы можете с помощью онлайн-куса
«Настройка оборудования MikroTik». Курс содержит все темы, которые изучаются на официальном курсе MTCNA. Автор курса – официальный тренер MikroTik. Подходит и тем, кто уже давно работает с микротиками, и тем, кто еще их не держал в руках. В курс входит 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.
POP! _OS против Linux Mint
Дистрибутивы Linux разработаны для обеспечения отличной совместимости, функций и расширенных возможностей администрирования. Однако всегда сложно выбрать один из этих дистрибутивов Linux, который может удовлетворить требования, поскольку в Интернете доступно несколько типов ОС Linux. Мы рассмотрели наиболее важную информацию о двух известных Pop! _OS и Linux Mint. К концу статьи вы получите все необходимые сведения о Pop! _OS и Linux Mint, которые помогут вам выбрать одну из этих ОС Linux.
POP! _OS
Pop! _OS основан на Ubuntu и предлагает среду с открытым исходным кодом в качестве операционной системы Linux. Эта ОС Linux по умолчанию состоит из настраиваемого рабочего стола GNOME и разработана американским производителем компьютеров Linux System76.
Последняя версия этой ОС Linux — 20.04, основанная на последней версии Ubuntu: 20.04 LTS. Таким образом, POP! _OS обеспечивает надежную и стабильную поддержку программного обеспечения, устраняя все предыдущие ошибки. Последняя версия Pop! _ OS также включает новую систему поддержки библиотек для управления репозиториями; пользователи могут легко изменить зеркала системного репозитория по умолчанию и восстановить зеркала по умолчанию.
Особенности Pop! _OS
Итак, вот список функций, включенных в последнюю версию Pop! _OS:
- Эта операционная система Linux имеет автоматическую мозаику окон.
- Пользователи могут использовать последнюю версию средства запуска новых приложений.
- Эта ОС Linux имеет функцию стекирования и расширенную поддержку гибридной графики.
- Pop! _Shop теперь поддерживает плоские пакеты.
- Он имеет поддержку GNOME 3.36 и Linux Kernel 5.8.
Linux Mint
Linux Mint также основан на Ubuntu, и это операционная система Linux, управляемая сообществом. Этот дистрибутив Linux наполнен различными типами приложений с открытым исходным кодом и бесплатными приложениями, поэтому Linux Mint может легко предлагать готовую поддержку мультимедиа. Этот дистрибутив Linux призван предоставить платформу, которая проста в использовании, элегантна и эффективна для любого оборудования.
Согласно отзывам пользователей, Linux mint — один из предпочтительных вариантов для перехода с Windows или Mac на среду Linux. Этот дистрибутив Linux существует с 2006 года и теперь стал одной из лучших операционных систем, удобных для пользователя.
Особенности Linux Mint
Linux Mint предлагает несколько функций, поэтому вот их список:
- В последней версии улучшены Cinnamon 3.8 и XApps.
- В Linux Mint есть великолепный экран приветствия и менеджер обновлений.
- В последней версии есть exFat, который поддерживается инструментом форматирования USB-накопителей.
- В этом дистрибутиве Linux есть фантастический менеджер программного обеспечения.
- Linux Mint имеет мультимедийные кодеки, включая шрифты Microsoft.
POP! _OS против Linux Mint: системные требования
| Минимальные требования | Linux Mint | Pop! _OS |
|---|---|---|
| Лучше всего для | Устройство среднего уровня | Устройство среднего уровня |
| Требования к оперативной памяти | Требуется минимум 1 ГБ, но рекомендуется 2 ГБ | Требуется минимум 2 ГБ, но рекомендуется 4 ГБ |
| Требования к процессору | 32-битный процессор X86 | Рекомендуется двухъядерный 64-битный |
POP! _OS против Linux Mint: таблица сравнения
| Факторы | Linux Mint | Pop! _OS |
|---|---|---|
| Создан | Дистрибутив, управляемый сообществом, на основе Ubuntu. | System76 (производитель AmericanLinux) |
| Требуется навык | Новичок | Новичок |
| На основе | Ubuntu и Debian | Выпуск Ubuntu LTS |
| Лучше всего для | Лучше всего для общих целей. | Лучше всего для общих целей. |
| Поддержка программного обеспечения | У него отличная система поддержки программного обеспечения. | Система поддержки программного обеспечения не лучше Linux Mint. |
| Требования к оборудованию | Требования к оборудованию среднего уровня | Требования к оборудованию среднего уровня |
| Легкость использования | Это простая в использовании операционная система Linux. | Лучше всего для начинающих пользователей. |
| Стабильность | Это очень стабильная ОС Linux. | Стабильность не лучше, чем у Linux Mint. |
| Циклы выпуска | У него есть фиксированный цикл выпуска, который происходит один раз в месяц. | У него фиксированный цикл выпуска: раз в два года. |
Заключение
Это завершает полное сравнение POP! _OS и Linux Mint, которое поможет вам выбрать один из этих дистрибутивов Linux в соответствии с вашими требованиями. Эти дистрибутивы Linux предлагают отличную совместимость и функции для новичков. Если вы переключитесь с Windows или Mac на Linux, вы можете выбрать одну из этих ОС Linux, чтобы предложить пользователям простые в использовании параметры и пользовательский интерфейс. На наш взгляд, Linux Mint лучше всего подходит для тех, кому нужен дистрибутив для рабочей станции, но Pop! _OS лучше всего для тех, кто хочет иметь игровой дистрибутив на основе Ubuntu.
Уязвимости состояния гонки в веб-приложениях
Когда веб-приложению, настроенному для управления функциями в фиксированной последовательности, требуется выполнить две или более операций одновременно, происходит атака состояния гонки. Этот метод использует преимущество временной задержки между введением услуги и началом контроля безопасности. Эта атака может быть осуществлена одним из двух способов, основанных на многопоточных приложениях: вторжение, вызванное ненадежными процессами, и вторжение, вызванное заслуживающим доверия процессом, который может иметь одинаковые и равные права.
Различные процессы могут взаимодействовать друг с другом без адекватных мер. Эти атаки также известны как атака Time of Check, атака Time of Use или атаки TOC/TOU. Уязвимости в условиях гонки возникают в первую очередь из-за базовых программных ошибок, которые обычно создают разработчики, и эти сбои оказались дорогостоящими. Злонамеренные организации использовали расовые условия для множества злонамеренных целей, например, от получения бесплатных ваучеров до кражи денег с онлайн-счетов и инвестиционных фирм.
Предположим, что два параллельных потока выполнения пытаются поднять значение глобальной переменной на 5. В конечном счете, тогда глобальная переменная будет иметь значение 10. Однако если все потоки выполняются одновременно, выполнение может быть неправильным без блокировки ресурсов или синхронизации. Когда первый поток выполняет некоторые манипуляции с этой глобальной переменной, второй поток читает ее и начинает выполнять некоторые другие манипуляции. В этом случае конечное значение будет не таким, как ожидалось.
Это происходит, так как эффект завершения одного потока зависит от результата другого. Когда два потока выполняются одновременно, будут непредвиденные последствия.
Объем атак на состояние расы:
Представьте себе, что что-то более важное выполняется двумя потоками из приведенного выше примера, например обмен деньгами между банковскими счетами. Чтобы правильно отправить деньги, программа должна будет выполнить эти задачи в следующей последовательности: проверить, достаточно ли остатка на счете отправителя, добавить деньги на счет получателя, а затем вычесть со счета отправителя. Но если вы одновременно отправляете два запроса, вы можете вызвать условие, при котором последовательность выполнения потока изменится. В подобной ситуации вы получите совсем другую сумму, чем ожидали.
Уязвимость Race condition была обнаружена Егором Хомаковым на сайте Starbucks. Он нашел способ создать бесконечное количество кредитов на подарочные ваучеры Starbucks бесплатно, используя разные браузеры с разными файлами cookie.
Выдающаяся атака Meltdown является примером уязвимости состояния расы. В атаке meltdown слабость вызывается параллельной обработкой извлечения данных из памяти и проверкой подлинности того, разрешен ли пользователю доступ к памяти. Этот недостаток позволяет инструменту избежать стандартных проверок привилегий, которые отделяют механизм атаки от доступа к данным ОС. Эта лазейка позволяет любому несанкционированному процессу просматривать данные и информацию с любого другого адреса, связанного с текущим состоянием прогресса в памяти. В процессе неправильного выполнения информация с неутвержденного адреса часто быстро складывается в кэш центрального процессора, из которого эта информация может быть восстановлена.
Реальные сценарии атак:
Постоянно отправляя многочисленные запросы на веб-сервер, вы можете искать и манипулировать условиями гонки в веб-приложениях. Если вы хотите узнать, можете ли вы снять больше денег, чем у вас есть на банковском счете, используя функцию curl, вы можете одновременно отправить несколько запросов на вывод средств на сервер.
curl (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000)
Чем больше требований вы подадите за короткий промежуток времени, тем выше вероятность того, что ваша атака сработает.
Более того, если вы отправляете асинхронные последующие запросы, вы будете следовать за пользователем несколько раз вместо отправки ответа об ошибке, то есть если вы добавите поддельный заголовок, содержащий %s, отбрасывая запросы с помощью turbo intruder, и вставите следующий код python:
def followReqs(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=40,
requestsPerConnection=100,
pipeline=False
)
for i in range(40):
engine.queue(target.req, str(i), gate='check')
engine.openGate('check')
.complete(timeout=60)
def responseHandle(req, interesting):
table.add(req)
Вы увидите кнопку атаки. После нажатия этой кнопки Turbo Intruder отправляет 40 запросов и сканирует коды состояния. Если вы видите несколько ответов со статусом 201 сгенерированный, это означает, что вы несколько раз следили за этим человеком.
Существует уязвимость race condition, при которой вы можете получить доступ к нескольким консолям, предлагаемым для бесплатных учетных записей. Большинство сайтов, предоставляющих бесплатные консоли, имеют бесплатные учетные записи, стандартные и премиальные пакеты. Бесплатные аккаунты предоставляют только 2 или 3 консоли на одного пользователя. Чтобы нарушить это ограничение и использовать неограниченное количество консолей, вторгнитесь в запрос GET, используя нулевые полезные нагрузки несколько раз, например 100 или 200. А затем удалите любую из консолей вручную из пользовательского интерфейса во время выполнения потоков.
Вывод:
В качестве средства подрыва контроля доступа включаются условия гонки. Любая программа, зависящая от механизмов контроля доступа, может оказаться уязвимой. Большую часть времени на сайтах финансовых учреждений хакеры используют расовые условия. Поскольку это может привести к неограниченным финансовым выгодам для хакера, если состояние гонки может быть обнаружено на жизненно важной функции, такой как снятие наличных, денежный перевод или оплата кредитной картой. Платформы электронной коммерции, видеоигры и услуги онлайн-голосования-это другие технологии высокого риска. Реализация безопасного параллелизма-это секрет избежания гоночных условий. И вы также можете использовать блокировки ресурсов. Также будет встроена функция блокировки для языков программирования с возможностями параллелизма, которые помогают предотвратить такие условия. Кроме того, соблюдение стандартов безопасного кодирования, т. е. концепции наименьших привилегий и кода аудита, уменьшит вероятность нарушения программы.


