[Из песочницы] Тяжелая терапия: лекарство от палева для MacOS

habr.png

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

Собственно, вот простой скрипт, который глушит управление firewall через внутренние сервисы системы MacOS на базе якорей и отдает управление напрямую пакетному фильтру, который блокирует вообще все входящие подключения:

#
# Ninja PF configuration file( original located on /etc/pf.conf.backup ).
#
# This file contains the main ruleset, which gets automatically loaded
# at startup.  PF will not be automatically enabled, however.  Instead,
# each component which utilizes PF is responsible for enabling and disabling
# PF via -E and -X as documented in pfctl(8).  That will ensure that PF
# is disabled only when the last enable reference is released.
#
# Care must be taken to ensure that the main ruleset does not get flushed,
# as the nested anchors rely on the anchor point defined here. In addition,
# to the anchors loaded by this file, some system services would dynamically 
# insert anchors into the main ruleset. These anchors will be added only when
# the system service is used and would removed on termination of the service.
#
# See pf.conf(5) for syntax.
#

# ICMP configure
icmp_types = "{echoreq, echorep, unreach}"
icmp6_types = "{echoreq, unreach, echorep, 133, 134, 135, 136, 137}"
netbios_types = "{137,138,139}"

interfaces = "{en0, en1, en2, en3, en4}"

# Base policy
set fingerprints "/etc/pf.os"
set block-policy drop
set state-policy if-bound
set require-order yes
set optimization aggressive
set ruleset-optimization none
set skip on lo0

scrub in all fragment reassemble no-df min-ttl 64  max-mss 1440
scrub out all random-id
block in log all

pass out quick flags S/SA modulate state

# Antispoofing
antispoof quick for $interfaces inet
antispoof quick for $interfaces inet6

# More secure settings
block in from urpf-failed to any
block in quick on $interfaces from any to 255.255.255.255
block in quick on $interfaces from any to 255.255.255.0

# ICMP policy
block in inet proto icmp all icmp-type $icmp_types keep state
block in inet6 proto icmp6 all icmp6-type $icmp6_types keep state
block in on $interfaces proto {tcp,udp} from any to any port $netbios_types


Не забудьте поставить галку включить firewall в preferences. Чтобы проверить, что PF запущен просто выполните в терминале

sudo pfctl -sa


Здесь кратко собранны паттерны правил управления соединениями и интерфейсами, а сама настройка максимально блокирует входящий трафик. Если у вас совсем паранойя — просто закоментируйте строчку set skip on lo0 и вы избавите систему от работоспособного web-сервера и заблокируете большинству приложений доступ к loop back интерфейсу (петля терминала).

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

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

Вот краткий листинг:

# 10.13.4 system ctl configuration

# Kernel IPC overrides
kern.ipc.somaxconn=100

# kernel security level(0, 1 - soft security level or 2 - can't install any software)
kern.securelevel=1

# Speed up TM backups
debug.lowpri_throttle_enabled=0
kern.coredump=0

# Networking settings
net.link.ether.inet.max_age=600
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
net.inet.ip.linklocal.in.allowbadttl=0

net.inet.icmp.bmcastecho=0
net.inet.icmp.icmplim=50
net.inet.icmp.maskrepl=0

net.inet.udp.blackhole=1
net.inet.tcp.blackhole=2
net.inet.tcp.delayed_ack=2
net.inet.tcp.always_keepalive=0
net.inet.tcp.rfc3390=1
net.inet.tcp.rfc1644=1
net.inet.tcp.tso=0

# Incoming and outgoing port ranges
net.inet.tcp.sack_globalmaxholes=2000
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535
net.inet.ip.portrange.hifirst=1024
net.inet.ip.portrange.hilast=2500

net.inet.ip.check_interface=1
net.inet.tcp.keepidle=50000
net.inet.ip.rtmaxcache=1024
net.inet.tcp.path_mtu_discovery=0
net.inet6.icmp6.rediraccept=0
net.inet.tcp.msl=4500

net.inet6.icmp6.nodeinfo=0
net.inet6.ip6.accept_rtadv=0
net.inet6.ip6.auto_linklocal=1

net.inet6.ip6.only_allow_rfc4193_prefixes=1
net.inet6.icmp6.nd6_onlink_ns_rfc4861=1


Данные параметры ядра ужесточают политику сетевых подключений включая все возможные RFC и блокируя все возможные шумы (эхо, редиректы и так далее), а отдельного внимания стоит параметр kern.securelevel=1, который может оказаться крайне полезным для pen тестера.

kern.securelevel=2 полностью заблокирует возможности установки в систему каких либо пакетов. Вообще наглухо. Но система при этом не потеряет работоспособности.

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

Далее скрипту добавлены опции кастомизации некоторых параметров отображения Finder и небольшие настройки для Safari. Например, стоит отключить AV Foundation и прочие медиа функции так, как одной сплойтерной картинкой с web сайта систему можно хакнуть через аудио и видео стримы.

И вообще, странно, но даже iTunes в MacOS следит, поэтому я предпочитаю полный танк.

Заплатка выложена на GitHub. Для запуска используйте

sudo ./fix.sh


Если у вас есть предложения и поправки — предлагаю поделиться своими соображениями в комментариях.

© Habrahabr.ru