
Для pull request в Metasploit
Это может решить проблему #8571, в которой запрашиваются модули Phoenix Talon.
На целевой машине двойное освобождение (double-free) срабатывает из-за того, что ядро сохраняет дополнительную копию mc_list в момент accept().
Машина, работающая на ядре 4.10.15 и ниже, находится под угрозой, если она выполняет следующую процедуру:
sockfd = socket(AF_INET, xx, IPPROTO_TCP);
setsockopt(sockfd, SOL_IP, MCAST_JOIN_GROUP, xxxx, xxxx);
bind(sockfd, xxxx, xxxx);
listen(sockfd, xxxx);
newsockfd = accept(sockfd, xxxx, xxxx);
close(newsockfd); // trigger release calls, handoff to RCU
sleep(5); // wait for rcu to free()
close(sockfd); // second free()
Родительский сокет sockfd создается. Он добавляется в multicast-группу с опцией MCAST_JOIN_GROUP.
При добавлении сокета в multicast-группу на локальном интерфейсе ядро выделяет память. На этом этапе
mc_list существует в родительском сокете.
После того, как сокету присваивается адрес с помощью bind(), listen() для ожидания соединения и accept().
accept() создает новый сокет newsockfd, в который копируются все необходимые поля родительского сокета,
включая значение указателя mc_list. На этом этапе существует несколько указателей, указывающих
на один и тот же блок памяти, отсюда и двойное освобождение.
Когда соединение установлено, ядро создает дочерний сокет, который наследует объект mc_list родительского сокета.
Эта ошибка наследования находится в inet_csk_clone_lock на строке 648 файла net/ipv4/inet_connection_sock.c.
Посмотрите исправление, чтобы увидеть однострочное исправление для этого непреднамеренного наследования.
Далее закройте дочерний сокет. Как объяснено выше, это не освобождает объект mc_list.
Он проходит через структуру RCU (remote-copy-update) для освобождения памяти.
sleep() на несколько секунд, чтобы убедиться, что передача RCU успеет вызвать kfree().
Наконец, закройте родительский сокет, что вызовет второе освобождение.
Простая DoS-атака. Удаленно запускает двойное освобождение на известной целевой машине, выполняющей необходимую серверную процедуру (объяснена выше). Это вызывает панику ядра.