Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixing compiler warnings and code cleanup #205

Open
wants to merge 20 commits into
base: master
Choose a base branch
from

Conversation

anphsw
Copy link
Contributor

@anphsw anphsw commented Aug 3, 2024

Предлагаю на рассмотрение патчи для уменьшения ошибок при компиляции, и чтобы самим потом не запутаться.
На данный момент собирается без варнингов с опциями "-Wall -Wno-unused -Wno-strict-aliasing -Wextra -Wno-sign-compare"
По скобкам (-Wparentheses): я добавил скобки в таком логическом порядке приоритетов, в котором их отрабатывает компилятор. Если автор имел ввиду другое - то значит это был явный баг и надо фиксить. Но на вид все ок.
По знаковым сравнениям (-Wtype-limits):

  • в mdig.c тут явный баг из-за signed типа.
  • в hkdf.c это баг копипасты. В оригинале был int и это сравнение смысл имело. Здесь же тип переменной size_t, и сравнение смысла не имеет.

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

helpers.c: В функции <<saconvmapped>>:
helpers.c:157:40: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
   uint32_t ip4 = *(uint32_t*)(((struct sockaddr_in6*)a)->sin6_addr.s6_addr+12);
                                        ^
helpers.c: В функции <<is_localnet>>:
helpers.c:171:152: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
   (a->sa_family==AF_INET6 && saismapped((struct sockaddr_in6 *)a) && (((struct sockaddr_in6 *)a)->sin6_addr.s6_addr[12]==127 || !*(uint32_t*)(((struct sockaddr_in6 *)a)->sin6_addr.s6_addr+12)));
                                                                                                                                                        ^
helpers.c: На верхнем уровне:
tpws_conn.c: В функции <<handle_proxy_mode>>:
tpws_conn.c:890:10: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
          port=S5_PORT_FROM_DD(m,rd);
          ^
tpws_conn.c: На верхнем уровне:
ip2net.c: В функции <<cmp6>>:
ip2net.c:86:46: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
  aa = __builtin_bswap64(((uint64_t*)((struct in6_addr *)a)->s6_addr)[0]);
                                              ^
ip2net.c:87:46: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
  bb = __builtin_bswap64(((uint64_t*)((struct in6_addr *)b)->s6_addr)[0]);
                                              ^
ip2net.c:99:47: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
   aa = __builtin_bswap64(((uint64_t*)((struct in6_addr *)a)->s6_addr)[1]);
                                               ^
ip2net.c:100:47: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
   bb = __builtin_bswap64(((uint64_t*)((struct in6_addr *)b)->s6_addr)[1]);
                                               ^
ip2net.c: В функции <<ip6_and>>:
ip2net.c:187:2: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
  ((uint64_t*)result->s6_addr)[0] = ((uint64_t*)a->s6_addr)[0] & ((uint64_t*)b->s6_addr)[0];
  ^
ip2net.c:187:2: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
ip2net.c:187:2: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
ip2net.c:188:2: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
  ((uint64_t*)result->s6_addr)[1] = ((uint64_t*)a->s6_addr)[1] & ((uint64_t*)b->s6_addr)[1];
  ^
ip2net.c:188:2: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
ip2net.c:188:2: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Wstrict-aliasing]
ip2net.c: На верхнем уровне:

-Wno-sign-compare - много, архитектурно вроде не влияет, можно менять.

также варнинги от cppcheck:

[nfq/desync.c:213]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'int'.
[nfq/desync.c:217]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'int'.
[nfq/desync.c:1242] -> [nfq/desync.c:1243]: (warning) Either the condition 'if(ip6hdr)' is redundant or there is possible null pointer dereference: ip6hdr.
[nfq/nfqws.c:582]: (warning) %X in format string (no. 1) requires 'unsigned int *' but the argument type is 'signed int *'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 3) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 4) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 8) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 9) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 10) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 11) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 12) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 13) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 14) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 15) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 18) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:1341]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:1353]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:180]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:203]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed char'.
[nfq/nfqws.c:203]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed char'.
[nfq/nfqws.c:237]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 16) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 17) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/nfqws.c:788]: (warning) %u in format string (no. 20) requires 'unsigned int' but the argument type is 'signed int'.
[nfq/protocol.c:280] -> [nfq/protocol.c:284]: (warning) Either the condition 'if(ext&&len_host)' is redundant or there is possible null pointer dereference: ext.
[tpws/protocol.c:270] -> [tpws/protocol.c:274]: (warning) Either the condition 'if(ext&&len_host)' is redundant or there is possible null pointer dereference: ext.

format фигня, а вот null pointer там действительно опасная штука. По типу обращения к ipv6hdr и только затем проверки, реально ли он существует.

Следующим этапом планирую погонять под valgrind на трафике ~300мбит, если утечки будут - напишу. Но пока держится стабильно.

==3801== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==3801==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==3801==    by 0x11093D: rawsend (darkmagic.c:1778)
==3801==    by 0x114F47: dpi_desync_tcp_packet_play (desync.c:1021)
==3801==    by 0x117879: dpi_desync_packet_play (desync.c:1645)
==3801==    by 0x117A35: replay_queue (desync.c:1676)
==3801==    by 0x113F44: dpi_desync_tcp_packet_play (desync.c:781)
==3801==    by 0x117879: dpi_desync_packet_play (desync.c:1645)
==3801==    by 0x11797B: dpi_desync_packet (desync.c:1662)
==3801==    by 0x11A045: processPacketData (nfqws.c:106)
==3801==    by 0x11A1C3: nfq_cb (nfqws.c:140)
==3801==    by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==3801==    by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0)
==3801==  Address 0xbecb2f81 is on thread 1's stack
==3801==  in frame bol-van#2, created by dpi_desync_tcp_packet_play (desync.c:478)
==3801==  Uninitialised value was created by a stack allocation
==3801==    at 0x112C35: dpi_desync_tcp_packet_play (desync.c:478)
@anphsw
Copy link
Contributor Author

anphsw commented Aug 3, 2024

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

[nfq/desync.c:1242] -> [nfq/desync.c:1243]: (warning) Either the condition 'if(ip6hdr)' is redundant or there is possible null pointer dereference: ip6hdr.
[nfq/protocol.c:280] -> [nfq/protocol.c:284]: (warning) Either the condition 'if(ext&&len_host)' is redundant or there is possible null pointer dereference: ext.
[tpws/protocol.c:270] -> [tpws/protocol.c:274]: (warning) Either the condition 'if(ext&&len_host)' is redundant or there is possible null pointer dereference: ext.
comments must start with "#", ";", "/" or newline at beginning of line
@bol-van
Copy link
Owner

bol-van commented Aug 14, 2024

на счет strict aliasing
ужасно не перевариваю этот механизм
его надо отключать в мейкфайле
хотя только в одном месте пробил мискомпил
в ip2net и только на gcc
там инлайново для одной функции отключается

@anphsw
Copy link
Contributor Author

anphsw commented Aug 15, 2024

По идее лучше не отключать, а править. Некоторые моменты конечно достаточно сложны, но я немного поправил.
Конкретно по helpers: т.к. в проекте используется netinet/in.h, то в helpers можно использовать этот заголовок тоже, а значит и встроенные макросы для разных типов адресов. Это как раз позволит избежать глупых ошибок и лишнего вызова memcmp.

@anphsw
Copy link
Contributor Author

anphsw commented Aug 15, 2024

По is_localnet() вообще функция делает не то, что написано, не проверяется ipv6 loopback, а ipv6-mapped 127.0.0.1 лупбэком в общем смысле не является. Про проверку 0.0.0.0 тоже самое.

@bol-van
Copy link
Owner

bol-van commented Aug 15, 2024

Про ::1 действительно пропустил
А ::ffff:127.0.0.0/104 в windows очень даже пингается
И 0.0.0.0 в linux

@anphsw
Copy link
Contributor Author

anphsw commented Aug 15, 2024

0.0.0.0 хоть и пингуется, но не может быть адресом источника (Без nonlocal_bind. Да и с ним будут очень большие проблемы).
Насколько я понял, именно для проверки адреса источника служит эта функция.

@bol-van
Copy link
Owner

bol-van commented Aug 15, 2024

Нет. Для запрета подключений к локалхосту через прокси

@bol-van
Copy link
Owner

bol-van commented Aug 15, 2024

Is_localnet() я поправил с целью распознавания ::/127

@anphsw
Copy link
Contributor Author

anphsw commented Aug 16, 2024

Добавил вариации mapped-адресов 0.0.0.0, 127.x.x.x через стандартные макросы. В принципе уже близко к финалу по количеству правок.

@bol-van
Copy link
Owner

bol-van commented Aug 16, 2024

только давайте примем, что
1.никаких переписей кода на memcpy в целях соблюсти SA
2.никаких инициализаций переменных только чтобы удовлетворить чекер
если переменная действительно используется неинициализированной это проблема
но действительно ли это так в каждом случае ?

@anphsw
Copy link
Contributor Author

anphsw commented Aug 16, 2024

darkmagic.c: В функции <<fill_tcphdr>>:
darkmagic.c:124:57: предупреждение: signed and unsigned type in conditional expression [-Wsign-compare]
   *(uint32_t*)(tcpopt+t+2) = timestamps ? timestamps[0] : -1;
                                                         ^
darkmagic.c:125:83: предупреждение: signed and unsigned type in conditional expression [-Wsign-compare]
   *(uint32_t*)(tcpopt+t+6) = (timestamps && !(fooling & FOOL_TS)) ? timestamps[1] : -1;
                                                                                   ^

Во тут еще не понимаю, было ли так задумано. Явно кастуем unsigned и пишем туда -1.

@anphsw
Copy link
Contributor Author

anphsw commented Aug 16, 2024

1.никаких переписей кода на memcpy в целях соблюсти SA

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

если переменная действительно используется неинициализированной это проблема
но действительно ли это так в каждом случае ?

Инициализирую только то, что явно используется не инициализированым (по проверке valgrind).

@bol-van
Copy link
Owner

bol-van commented Aug 16, 2024

Явно кастуем unsigned и пишем туда -1.

Тут имелась в виду запись туда 0xFFFFFFFF
Если cpu работает на дополнительном коде, это должно работать
Но остались ли cpu, работающие на обратном коде ?
В принципе да, лучше туда написать 0xFFFFFFFF

@bol-van
Copy link
Owner

bol-van commented Aug 18, 2024

В hkdfExpand size_t < 0
согласен, но этот код не я писал. взято из паблик домейна

@bol-van
Copy link
Owner

bol-van commented Aug 18, 2024

static uint8_t dpi_desync_tcp_packet_play
static uint8_t dpi_desync_udp_packet_play

size_t pkt1_len = sizeof(pkt1), pkt2_len;
	memset (pkt1, 0, pkt1_len);

тут должно быть идет ругань на неполный switch

pkt1_len = sizeof(pkt1);
b = false;
switch(desync_mode)
{
case DESYNC_FAKE_KNOWN:
.............
if (b)
{
  if (!rawsend_rep((struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
   return verdict;

должно быть анализатор считает, что часть этого свитча может не заполнять pkt1, и rawsend отошлет uninitialized data
но это не так, поскольку b=true делается только там, где pkt1 заполняется
эта конструкция может и не очень красивая, но она позволяет не дублировать код несколько раз

а дальше везде вроде заполняется pkt1 перед отправкой. непосредственно перед rawsend

в свитч дописываю такую конструкцию, надеюсь поможет

default:
// fix code analyzer warning
 pkt1_len=0;
 break;

@bol-van
Copy link
Owner

bol-van commented Aug 18, 2024

На счет is_localnet() в tpws
макросы это хорошо, но надо еще проверять на NULL address
0.0.0.0 и [::]

@bol-van
Copy link
Owner

bol-van commented Aug 18, 2024

И на счет ip, ip6hdr
Чтобы точно на входе был только один не-NULL, а другой NULL
вставляю дополнительную проверку

  // additional safety check
  if (!!ip == !!ip6hdr) return verdict;

может конечно это и не успокоит анализатор, но обезопасят мои проверки на счет null dereference при любом раскладе

@anphsw
Copy link
Contributor Author

anphsw commented Aug 21, 2024

Пока держу ситуацию на контроле.
В коммите 93aa69f наверное стоит вынести ntohl в соответствующие макросы extract и loopback (тут я забыл его добавить, извиняюсь), чтобы по 10 раз его не повторять. Эти два макроса определены локально в заголовках. Для INADDR_ANY же ntohl очевидно смысла не имеет, ведь это 0.0.0.0

Про (*dom & 0x80) идея-то не плохая, но я вообще подумывал превратить его из blacklist в whitelist, будет парой инструкций меньше возможно (тогда условий для проверки будет меньше, ведь допустимые символы доменных имен заданы жестко). Если подходит - запилю.

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

Еще вопрос про то, что много кода дублировано - планируется ли выносить общие функции в отдельное место?

@bol-van
Copy link
Owner

bol-van commented Aug 21, 2024

Я уже накатил те коммиты, к которым у меня особых вопросов нет
да, ntohl уже сам обнаружил и внес. к тому же там была проблема со сборкой на BSD
IN6_IS_ADDR_LOOPBACK и IN6_IS_ADDR_UNSPECIFIED хотят sin6_addr, а не sin_addr.s_addr

на счет scope. там только стек экономится. все равно он дорастет до своего максимума при самом "неблагоприятном" ветвлении, а освобождение страниц стека не предусмотрено. так что без разницы. на RSS это не повлияет никак

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

долго смотрел и думал как мог возникнуть uninitialized use в send, так и не понял
как вообще реализован детект unitialized data в рантайме ?

@anphsw
Copy link
Contributor Author

anphsw commented Aug 21, 2024

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

Наверное все-таки лучше общая, чем потенциальная возможность рассинхрона кода, когда в одном месте пофиксил, а в другом забыл.
Конкрено либа (проект не такой большой) тут не обязательна, достаточно папки common и что-то похожего на gcc ../common/xxx.c в мейкфайле. Тогда для сборки нужно будет две папки копировать - папку проекта и common. Ради того, чтобы не наступать на грабли - почему бы и нет?

долго смотрел и думал как мог возникнуть uninitialized use в send, так и не понял
как вообще реализован детект unitialized data в рантайме ?

Конкретно у valgrind происходит так: собираю glibc с debug специально под valgrind, собираю проект также с -O0 -g и с -O3 -g (конкретно в этом случае разницы не было в выводе, а вообще бывает ловит что-то дополнительное).
valgrind перехватывает на себя все системные вызовы, которые может.
По uninitialized это именно чтение из неинициализированой части. Т.е. мы задали buf + len, и каким-то образом len затрагивает незаполненый buf в sendto.
Тут чукча не читатель, чукча - писатель. Листинг скинул, внутрь самого sendto уже не полез, смысла нет.

@bol-van
Copy link
Owner

bol-van commented Aug 21, 2024

Не, а физически то как это делается ?
заполняется паттерном некоторым буфер, а потом на него проверяется ?
а если 1 байт не заполненным остался, то 1 байт будем проверять на паттерн ? тогда вероятность ложного срабатывания 1/256 всего.

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

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

@anphsw
Copy link
Contributor Author

anphsw commented Aug 21, 2024

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

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

Все вызовы valgrind оборачивает в свои обертки. Если на стеке хранить - то точно обнаружит, если в регистрах - как повезет. На 100% не скажу, но если жалуется, значит чтение по этим адресам в памяти было. В детали настолько не уходил.

@bol-van
Copy link
Owner

bol-van commented Aug 21, 2024

Вроде здесь на rawsend он кричит ?
prepare_tcp_segment конструирует tcp пакет на базе входных данных
имеет in/out параметр с длиной. на входе - максимальная длина буфера
на выходе - реально заполненная длина
потом эта длина передается на rawsend, который вызывает sendto с длиной, возвращенной из prepare_tcp_segment
сам prepare_tcp_segment долго смотрел как бы он мог что-то недозаписать. так и не нашел
или дело не в заполнении буфера pkt1, а в том, что prepare_tcp_segment сам берет какую-то неинциализированную ерунду на вход с предыдущего этапа ?

каким образом оно вышло на эту ситуацию ?
nfqws с valgrind работал "по назначению" и вдруг оно случилось на каком-то этапе ?

		pkt1_len = sizeof(pkt1);
		switch(desync_mode)
		{
			case DESYNC_DISORDER:
			case DESYNC_DISORDER2:
				if (split_pos)
				{
					uint8_t fakeseg[DPI_DESYNC_MAX_FAKE_LEN+100], *seg;
					size_t seg_len;

					if (params.desync_seqovl>=split_pos)
					{
						DLOG("seqovl>=split_pos. desync is not possible.\n")
						return verdict;
					}

					if (split_pos<len_payload)
					{
						if (params.desync_seqovl)
						{
							seg_len = len_payload-split_pos+params.desync_seqovl;
							if (seg_len>sizeof(fakeseg))
							{
								DLOG("seqovl is too large\n")
								return verdict;
							}
							fill_pattern(fakeseg,params.desync_seqovl,params.seqovl_pattern,sizeof(params.seqovl_pattern));
							memcpy(fakeseg+params.desync_seqovl,data_payload+split_pos,len_payload-split_pos);
							seg = fakeseg;
						}
						else
						{
							seg = data_payload+split_pos;
							seg_len = len_payload-split_pos;
						}

						if (!prepare_tcp_segment((struct sockaddr *)&src, (struct sockaddr *)&dst, flags_orig, net32_add(net32_add(tcphdr->th_seq,split_pos),-params.desync_seqovl), tcphdr->th_ack, tcphdr->th_win, scale_factor, timestamps,
								ttl_orig,fooling_orig,params.desync_badseq_increment,params.desync_badseq_ack_increment,
								seg, seg_len, pkt1, &pkt1_len))
							return verdict;
						DLOG("sending 2nd out-of-order tcp segment %zu-%zu len=%zu seqovl=%u : ",split_pos,len_payload-1, len_payload-split_pos, params.desync_seqovl)
						hexdump_limited_dlog(seg,seg_len,PKTDATA_MAXDUMP); DLOG("\n")
						if (!rawsend((struct sockaddr *)&dst, desync_fwmark, ifout , pkt1, pkt1_len))
							return verdict;

@anphsw
Copy link
Contributor Author

anphsw commented Aug 21, 2024

стек вызова по версии valgrind (если компилятор что-то выкинул, то вызова не будет):

==3801==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==3801==    by 0x11093D: rawsend (darkmagic.c:1778)
==3801==    by 0x114F47: dpi_desync_tcp_packet_play (desync.c:1021)
==3801==    by 0x117879: dpi_desync_packet_play (desync.c:1645)
==3801==    by 0x117A35: replay_queue (desync.c:1676)
итд

т.е. на всех этих этапах происходила передача неинициализированой области в следующую функцию и в конце ее чтение

==3801== Uninitialised value was created by a stack allocation

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

каким образом оно вышло на эту ситуацию ?
nfqws с valgrind работал "по назначению" и вдруг оно случилось на каком-то этапе ?

По назначению, случилось прямо на старте. Возможно даже на первом пакете. Вообще я туда гнал немало живого трафика для теста, если по входящему пересчитать это 300 мегабит с ютуба, по исходящему в пределах 3-5.

@bol-van
Copy link
Owner

bol-van commented Aug 21, 2024

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

@anphsw
Copy link
Contributor Author

anphsw commented Aug 21, 2024

Вот как раз после memset (pkt1, 0, pkt1_len); valgrind уже этой ошибки не находит.
Это конечно костыль, по идее надо разбираться, кто мусор этот пропускает в rawsend-sendto.

@bol-van
Copy link
Owner

bol-van commented Aug 21, 2024

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

там был ipv4 или ipv6 ?
использовался ли seqovl в параметрах ?
действительно ли применялся disorder или disorder2 ?

@anphsw
Copy link
Contributor Author

anphsw commented Aug 21, 2024

ipv4 only, ipv6 нет и не мог поступить на вход.
tcp/443, disorder2, без seqovl

В принципе мне нет сложности повторить тест с разными параметрами, напишите несколько пресетов и я сделаю.
Единственное, что ipv6 трафика совсем нет.

@bol-van
Copy link
Owner

bol-van commented Aug 21, 2024

мне лишь важно знать ветку выполнения
собственно на disorder и смотрел. без seqovl там еще исключаются более сложные пути

интересно было бы хоть посмотреть на лог --debug, когда оно "падает"
оно пишет что оно шлет, первые байты
можно сделать, чтобы при обнаружении проблемы процесс сразу же завершался ?
так поймем это совсем мусор или нет

можно еще тут длину побольше сделать
hexdump_limited_dlog(seg,seg_len,PKTDATA_MAXDUMP); DLOG("\n")
вместо PKTDATA_MAXDUMP сюда вписать 1500

@anphsw
Copy link
Contributor Author

anphsw commented Aug 28, 2024

Итак, провел тесты, вот листинг:
split2: (fake дает тот же результат)

==27442== Memcheck, a memory error detector
==27442== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==27442== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==27442== Command: /tmp/zapret-nfqws-debug --user=nobody --qnum=200 --dpi-desync=split2 --hostlist=/etc/zapret/allow-domains.txt
==27442==
==27442== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27442==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27442==    by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0)
==27442==    by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0)
==27442==    by 0x4846BD0: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==    by 0x119E47: nfq_main (nfqws.c:176)
==27442==    by 0x11C970: main (nfqws.c:1767)
==27442==  Address 0xbea51089 is on thread 1's stack
==27442==  Uninitialised value was created by a stack allocation
==27442==    at 0x4846B56: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==
==27442== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27442==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27442==    by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0)
==27442==    by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0)
==27442==    by 0x48472D5: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==    by 0x119F3D: nfq_main (nfqws.c:195)
==27442==    by 0x11C970: main (nfqws.c:1767)
==27442==  Address 0xbea51089 is on thread 1's stack
==27442==  in frame #3, created by nfq_set_mode (???:)
==27442==  Uninitialised value was created by a stack allocation
==27442==    at 0x4847256: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==
PR_SET_NO_NEW_PRIVS(prctl): Invalid argument
==27442== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27442==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27442==    by 0x110A5B: rawsend (darkmagic.c:1734)
==27442==    by 0x115321: dpi_desync_tcp_packet_play (desync.c:1104)
==27442==    by 0x1173BE: dpi_desync_packet_play (desync.c:1649)
==27442==    by 0x1174C0: dpi_desync_packet (desync.c:1666)
==27442==    by 0x119B16: processPacketData (nfqws.c:107)
==27442==    by 0x119CAF: nfq_cb (nfqws.c:147)
==27442==    by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==    by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0)
==27442==    by 0x4847229: nfq_handle_packet (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==    by 0x11A0DF: nfq_main (nfqws.c:236)
==27442==    by 0x11C970: main (nfqws.c:1767)
==27442==  Address 0xbea4a0b1 is on thread 1's stack
==27442==  in frame #2, created by dpi_desync_tcp_packet_play (desync.c:478)
==27442==  Uninitialised value was created by a stack allocation
==27442==    at 0x112A55: dpi_desync_tcp_packet_play (desync.c:478)
==27442==
==27442== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27442==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27442==    by 0x110A5B: rawsend (darkmagic.c:1734)
==27442==    by 0x11558F: dpi_desync_tcp_packet_play (desync.c:1123)
==27442==    by 0x1173BE: dpi_desync_packet_play (desync.c:1649)
==27442==    by 0x1174C0: dpi_desync_packet (desync.c:1666)
==27442==    by 0x119B16: processPacketData (nfqws.c:107)
==27442==    by 0x119CAF: nfq_cb (nfqws.c:147)
==27442==    by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==    by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0)
==27442==    by 0x4847229: nfq_handle_packet (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27442==    by 0x11A0DF: nfq_main (nfqws.c:236)
==27442==    by 0x11C970: main (nfqws.c:1767)
==27442==  Address 0xbea4a0b1 is on thread 1's stack
==27442==  in frame #2, created by dpi_desync_tcp_packet_play (desync.c:478)
==27442==  Uninitialised value was created by a stack allocation
==27442==    at 0x112A55: dpi_desync_tcp_packet_play (desync.c:478)
==27442==
==27442==
==27442== Process terminating with default action of signal 2 (SIGINT)
==27442==    at 0x4961FF6: recv (in /tmp/debug/lib/libc-2.22.so)
==27442==    by 0x11A122: nfq_main (nfqws.c:233)
==27442==    by 0x11C970: main (nfqws.c:1767)
Loading hostlist /etc/zapret/allow-domains.txt
loading plain text list
Loaded 11 hosts from /etc/zapret/allow-domains.txt
opening library handle
unbinding existing nf_queue handler for AF_INET (if any)
binding nfnetlink_queue as nf_queue handler for AF_INET
binding this socket to queue '200'
setting copy_packet mode
initializing raw sockets bind-fix4=0 bind-fix6=0
Running as UID=102 GID=102
==27442==
==27442== HEAP SUMMARY:
==27442==     in use at exit: 56,856 bytes in 305 blocks
==27442==   total heap usage: 457 allocs, 152 frees, 139,352 bytes allocated
==27442==
==27442== LEAK SUMMARY:
==27442==    definitely lost: 0 bytes in 0 blocks
==27442==    indirectly lost: 0 bytes in 0 blocks
==27442==      possibly lost: 0 bytes in 0 blocks
==27442==    still reachable: 56,856 bytes in 305 blocks
==27442==         suppressed: 0 bytes in 0 blocks
==27442== Reachable blocks (those to which a pointer was found) are not shown.
==27442== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==27442==
==27442== For lists of detected and suppressed errors, rerun with: -s
==27442== ERROR SUMMARY: 266 errors from 4 contexts (suppressed: 0 from 0)

disorder2:

==27025== Memcheck, a memory error detector
==27025== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==27025== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==27025== Command: /tmp/zapret-nfqws-debug --user=nobody --qnum=200 --dpi-desync=disorder2 --hostlist=/etc/zapret/allow-domains.txt
==27025==
==27025== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27025==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27025==    by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0)
==27025==    by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0)
==27025==    by 0x4846BD0: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==    by 0x119E47: nfq_main (nfqws.c:176)
==27025==    by 0x11C970: main (nfqws.c:1767)
==27025==  Address 0xbe8f4089 is on thread 1's stack
==27025==  Uninitialised value was created by a stack allocation
==27025==    at 0x4846B56: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==
==27025== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27025==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27025==    by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0)
==27025==    by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0)
==27025==    by 0x48472D5: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==    by 0x119F3D: nfq_main (nfqws.c:195)
==27025==    by 0x11C970: main (nfqws.c:1767)
==27025==  Address 0xbe8f4089 is on thread 1's stack
==27025==  in frame #3, created by nfq_set_mode (???:)
==27025==  Uninitialised value was created by a stack allocation
==27025==    at 0x4847256: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==
PR_SET_NO_NEW_PRIVS(prctl): Invalid argument
==27025== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27025==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27025==    by 0x110A5B: rawsend (darkmagic.c:1734)
==27025==    by 0x114B65: dpi_desync_tcp_packet_play (desync.c:1021)
==27025==    by 0x1173BE: dpi_desync_packet_play (desync.c:1649)
==27025==    by 0x1174C0: dpi_desync_packet (desync.c:1666)
==27025==    by 0x119B16: processPacketData (nfqws.c:107)
==27025==    by 0x119CAF: nfq_cb (nfqws.c:147)
==27025==    by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==    by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0)
==27025==    by 0x4847229: nfq_handle_packet (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==    by 0x11A0DF: nfq_main (nfqws.c:236)
==27025==    by 0x11C970: main (nfqws.c:1767)
==27025==  Address 0xbe8ed0b1 is on thread 1's stack
==27025==  in frame #2, created by dpi_desync_tcp_packet_play (desync.c:478)
==27025==  Uninitialised value was created by a stack allocation
==27025==    at 0x112A55: dpi_desync_tcp_packet_play (desync.c:478)
==27025==
==27025== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==27025==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==27025==    by 0x110A5B: rawsend (darkmagic.c:1734)
==27025==    by 0x114E6E: dpi_desync_tcp_packet_play (desync.c:1046)
==27025==    by 0x1173BE: dpi_desync_packet_play (desync.c:1649)
==27025==    by 0x1174C0: dpi_desync_packet (desync.c:1666)
==27025==    by 0x119B16: processPacketData (nfqws.c:107)
==27025==    by 0x119CAF: nfq_cb (nfqws.c:147)
==27025==    by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==    by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0)
==27025==    by 0x4847229: nfq_handle_packet (in /usr/lib/libnetfilter_queue.so.1.3.0)
==27025==    by 0x11A0DF: nfq_main (nfqws.c:236)
==27025==    by 0x11C970: main (nfqws.c:1767)
==27025==  Address 0xbe8ed0b1 is on thread 1's stack
==27025==  in frame #2, created by dpi_desync_tcp_packet_play (desync.c:478)
==27025==  Uninitialised value was created by a stack allocation
==27025==    at 0x112A55: dpi_desync_tcp_packet_play (desync.c:478)
==27025==
==27025==
==27025== Process terminating with default action of signal 2 (SIGINT)
==27025==    at 0x4961FF6: recv (in /tmp/debug/lib/libc-2.22.so)
==27025==    by 0x11A122: nfq_main (nfqws.c:233)
==27025==    by 0x11C970: main (nfqws.c:1767)
Loading hostlist /etc/zapret/allow-domains.txt
loading plain text list
Loaded 11 hosts from /etc/zapret/allow-domains.txt
opening library handle
unbinding existing nf_queue handler for AF_INET (if any)
binding nfnetlink_queue as nf_queue handler for AF_INET
binding this socket to queue '200'
setting copy_packet mode
initializing raw sockets bind-fix4=0 bind-fix6=0
Running as UID=102 GID=102
==27025==
==27025== HEAP SUMMARY:
==27025==     in use at exit: 12,072 bytes in 83 blocks
==27025==   total heap usage: 601 allocs, 518 frees, 224,034 bytes allocated
==27025==
==27025== LEAK SUMMARY:
==27025==    definitely lost: 0 bytes in 0 blocks
==27025==    indirectly lost: 0 bytes in 0 blocks
==27025==      possibly lost: 0 bytes in 0 blocks
==27025==    still reachable: 12,072 bytes in 83 blocks
==27025==         suppressed: 0 bytes in 0 blocks
==27025== Reachable blocks (those to which a pointer was found) are not shown.
==27025== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==27025==
==27025== For lists of detected and suppressed errors, rerun with: -s
==27025== ERROR SUMMARY: 292 errors from 4 contexts (suppressed: 0 from 0)

disorder2 имеет дополнительное срабатывание триггера uninitialized
Перечислены разные срабатывания по типу (общее количество указано в errors, оно примерно соответствует количеству пакетов, поступивших через nfqueue)

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

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

Длинный лог тут ==29417== Memcheck, a memory error detector ==29417== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==29417== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info ==29417== Command: /tmp/zapret-nfqws-debug --user=nobody --qnum=200 --dpi-desync=disorder2 --hostlist=/etc/zapret/allow-domains.txt --debug=1 ==29417== ==29417== Syscall param socketcall.sendto(msg) points to uninitialised byte(s) ==29417== at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so) ==29417== by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0) ==29417== by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0) ==29417== by 0x4846BD0: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== by 0x119E68: nfq_main (nfqws.c:176) ==29417== by 0x11C991: main (nfqws.c:1767) ==29417== Address 0xbef2a079 is on thread 1's stack ==29417== Uninitialised value was created by a stack allocation ==29417== at 0x4846B56: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== ==29417== Syscall param socketcall.sendto(msg) points to uninitialised byte(s) ==29417== at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so) ==29417== by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0) ==29417== by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0) ==29417== by 0x48472D5: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== by 0x119F5E: nfq_main (nfqws.c:195) ==29417== by 0x11C991: main (nfqws.c:1767) ==29417== Address 0xbef2a079 is on thread 1's stack ==29417== in frame #3, created by nfq_set_mode (???:) ==29417== Uninitialised value was created by a stack allocation ==29417== at 0x4847256: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== PR_SET_NO_NEW_PRIVS(prctl): Invalid argument ==29417== Syscall param socketcall.sendto(msg) points to uninitialised byte(s) ==29417== at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so) ==29417== by 0x110A5B: rawsend (darkmagic.c:1734) ==29417== by 0x114B6E: dpi_desync_tcp_packet_play (desync.c:1021) ==29417== by 0x1173DF: dpi_desync_packet_play (desync.c:1649) ==29417== by 0x1174E1: dpi_desync_packet (desync.c:1666) ==29417== by 0x119B37: processPacketData (nfqws.c:107) ==29417== by 0x119CD0: nfq_cb (nfqws.c:147) ==29417== by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0) ==29417== by 0x4847229: nfq_handle_packet (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== by 0x11A100: nfq_main (nfqws.c:236) ==29417== by 0x11C991: main (nfqws.c:1767) ==29417== Address 0xbef230a1 is on thread 1's stack ==29417== in frame #2, created by dpi_desync_tcp_packet_play (desync.c:478) ==29417== Uninitialised value was created by a stack allocation ==29417== at 0x112A55: dpi_desync_tcp_packet_play (desync.c:478) ==29417== ==29417== Syscall param socketcall.sendto(msg) points to uninitialised byte(s) ==29417== at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so) ==29417== by 0x110A5B: rawsend (darkmagic.c:1734) ==29417== by 0x114E7D: dpi_desync_tcp_packet_play (desync.c:1046) ==29417== by 0x1173DF: dpi_desync_packet_play (desync.c:1649) ==29417== by 0x1174E1: dpi_desync_packet (desync.c:1666) ==29417== by 0x119B37: processPacketData (nfqws.c:107) ==29417== by 0x119CD0: nfq_cb (nfqws.c:147) ==29417== by 0x4846B20: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== by 0x4851ABD: nfnl_handle_packet (in /usr/lib/libnfnetlink.so.0.2.0) ==29417== by 0x4847229: nfq_handle_packet (in /usr/lib/libnetfilter_queue.so.1.3.0) ==29417== by 0x11A100: nfq_main (nfqws.c:236) ==29417== by 0x11C991: main (nfqws.c:1767) ==29417== Address 0xbef230a1 is on thread 1's stack ==29417== in frame #2, created by dpi_desync_tcp_packet_play (desync.c:478) ==29417== Uninitialised value was created by a stack allocation ==29417== at 0x112A55: dpi_desync_tcp_packet_play (desync.c:478) ==29417== Loading hostlist /etc/zapret/allow-domains.txt loading plain text list Loaded 11 hosts from /etc/zapret/allow-domains.txt initializing conntrack with timeouts tcp=60:300:60 udp=60 opening library handle unbinding existing nf_queue handler for AF_INET (if any) binding nfnetlink_queue as nf_queue handler for AF_INET binding this socket to queue '200' setting copy_packet mode initializing raw sockets bind-fix4=0 bind-fix6=0 set_socket_buffers fd=4 rcvbuf=2048 sndbuf=32768 fd=4 SO_RCVBUF=4096 fd=4 SO_SNDBUF=65536 set_socket_buffers fd=5 rcvbuf=2048 sndbuf=32768 fd=5 SO_RCVBUF=4096 fd=5 SO_SNDBUF=65536 Running as UID=102 GID=102 set_socket_buffers fd=3 rcvbuf=65536 sndbuf=32768 fd=3 SO_RCVBUF=131072 fd=3 SO_SNDBUF=65536 packet: id=1 len=640 mark=00000000 IP4: 10.18.172.111 => 80.64.175.140 proto=tcp ttl=61 sport=36238 dport=443 flags=AP seq=3975708529 ack_seq=3963286899 TCP: 16 03 01 02 47 01 00 02 43 03 03 6D 1D 8A 5E C7 3F E2 73 B8 A8 34 4B 7A FE 88 51 AE 81 7F CB 41 ... : ....G...C..m..^.?.s..4Kz..Q..A ... packet contains full TLS ClientHello hostname: rr1---sn-npcnxu-v8cs.googlevideo.com Checking include hostlist Hostlist check for rr1---sn-npcnxu-v8cs.googlevideo.com : negative Hostlist check for googlevideo.com : positive dpi desync src=10.18.172.111:36238 dst=80.64.175.140:443 split pos 2 sending 2nd out-of-order tcp segment 2-587 len=586 seqovl=0 : 01 02 47 01 00 02 43 03 03 6D 1D 8A 5E C7 3F E2 73 B8 A8 34 4B 7A FE 88 51 AE 81 7F CB 41 DF D9 8D 0E 01 1C A4 8D 02 B3 AC 20 35 05 6B A2 79 25 9D 07 02 66 9F 52 BB 3D 55 F4 09 E9 CA 1B 44 2D 69 90 8C 9C C1 8E 05 C0 A9 3F 00 20 4A 4A 13 01 13 02 13 03 C0 2B C0 2F C0 2C C0 30 CC A9 CC A8 C0 13 C0 14 00 9C 00 9D 00 2F 00 35 01 00 01 DA CA CA 00 00 00 33 00 2B 00 29 7A 7A 00 01 00 00 1D 00 20 C4 4A 03 AC 4D E8 42 1B A3 B0 58 DA C1 5E 58 4A 41 21 35 F5 E6 09 AB C4 AA BF BA AC 54 E0 0C 45 00 0B 00 02 01 00 00 23 00 00 FE 0D 00 FA 00 00 01 00 01 8A 00 20 2F 5A 44 C1 C4 0B 1A 28 BE 9A 7F B9 85 B9 C4 14 82 12 8A 03 61 1E E2 47 57 EA 31 F7 35 25 B5 6A 00 D0 CD 80 0B C4 C3 44 AC C4 34 B3 F0 3F A6 5E D7 AB 41 BD 3B FB F7 4D 82 80 1F 4B F6 D7 9C 50 EF 08 25 7B 9B 76 42 5A 8C 4A B2 7C 70 7A C0 D8 C5 4A DF 49 1F 8E C5 24 64 65 9C 86 4C ED AE ED 94 EB ED 19 82 DA A7 32 A5 45 0E 57 E1 46 C4 B9 F1 50 DB C7 E6 F3 E6 34 F6 52 2A 23 97 4A FB 93 78 04 EC 88 8E 10 51 CF D2 52 A7 E0 A0 C6 91 0A BA 53 FC A5 F0 5C A2 20 CB 86 8D E3 E4 95 23 1A EF 6C F9 D2 FA 14 70 19 79 00 39 C5 60 08 FB 33 12 99 10 8B 50 57 71 70 6F 8B E9 1E BD 1A E1 42 D8 EA 48 69 5F D2 4F 7B 15 A7 70 AB D8 A1 F7 38 30 3C 56 00 BF 4B 13 1D 22 A4 8C 6B 4D 01 95 C6 B9 64 AC 7D CB FD 62 52 A3 95 9F 4C C7 9F 5C 70 00 B3 00 17 00 00 00 12 00 00 44 69 00 05 00 03 02 68 32 00 0D 00 12 00 10 04 03 08 04 04 01 05 03 08 05 05 01 08 06 06 01 00 0A 00 0A 00 08 7A 7A 00 1D 00 17 00 18 00 10 00 0E 00 0C 02 68 32 08 68 74 74 70 2F 31 2E 31 00 2D 00 02 01 01 00 2B 00 07 06 EA EA 03 04 03 03 00 05 00 05 01 00 00 00 00 00 1B 00 03 02 00 02 00 00 00 29 00 27 00 00 24 72 72 31 2D 2D 2D 73 6E 2D 6E 70 63 6E 78 75 2D 76 38 63 73 2E 67 6F 6F 67 6C 65 76 69 64 65 6F 2E 63 6F 6D FF 01 00 01 00 5A 5A 00 01 00 : ..G...C..m..^.?.s..4Kz..Q..A........... 5.k.y%...f.R.=U.....D-i........?. JJ.......+./.,.0............./.5.........3.+.)zz...... .J..M.B...X..^XJA!5.........T..E.......#............. /ZD....(..........a..GW.1.5%.j.......D..4..?.^..A.;..M...K...P..%{.vBZ.J.|pz...J.I...$de..L..........2.E.W.F...P.....4.R*#.J..x.....Q..R.......S...\. ......#..l....p.y.9.`..3....PWqpo......B..Hi_.O{..p....80 173.194.73.101 proto=tcp ttl=61 sport=61598 dport=443 flags=AP seq=403065929 ack_seq=3663994170 TCP: 16 03 01 02 12 01 00 02 0E 03 03 40 9C E9 10 0E 9B AA 78 34 FA 04 34 EC AF 32 04 DD 38 D3 CF E3 ... : [email protected]... ... packet contains full TLS ClientHello hostname: play.google.com Checking include hostlist Hostlist check for play.google.com : negative Hostlist check for google.com : negative Hostlist check for com : negative not applying tampering to this request packet: id=2 pass unmodified packet: id=3 len=60 mark=00000000 IP4: 10.18.174.221 => 173.194.222.156 proto=tcp ttl=61 sport=35020 dport=443 flags=S seq=480458332 ack_seq=0 packet: id=3 pass unmodified packet: id=4 len=608 mark=00000000 IP4: 10.18.172.111 => 80.64.175.140 proto=tcp ttl=61 sport=36240 dport=443 flags=AP seq=2546205334 ack_seq=3822196974 TCP: 16 03 01 02 27 01 00 02 23 03 03 4F E5 14 6A 28 07 CA 83 13 25 F9 C8 63 EE 44 5B E6 55 3F 4E B6 ... : ....'...#..O..j(....%..c.D[.U?N. ... packet contains full TLS ClientHello hostname: rr1---sn-npcnxu-v8cs.googlevideo.com Checking include hostlist Hostlist check for rr1---sn-npcnxu-v8cs.googlevideo.com : negative Hostlist check for googlevideo.com : positive dpi desync src=10.18.172.111:36240 dst=80.64.175.140:443 split pos 2 sending 2nd out-of-order tcp segment 2-555 len=554 seqovl=0 : 01 02 27 01 00 02 23 03 03 4F E5 14 6A 28 07 CA 83 13 25 F9 C8 63 EE 44 5B E6 55 3F 4E B6 BE 03 CB 14 8F CC 07 15 4D 3C BE 20 99 1C C0 97 A0 CF 92 99 0B 61 CD 86 C8 C6 70 96 99 79 E2 14 84 8D 44 FD 36 D2 10 8F 01 AB 72 0A 00 20 0A 0A 13 01 13 02 13 03 C0 2B C0 2F C0 2C C0 30 CC A9 CC A8 C0 13 C0 14 00 9C 00 9D 00 2F 00 35 01 00 01 BA 5A 5A 00 00 00 33 00 2B 00 29 EA EA 00 01 00 00 1D 00 20 2B 91 FE F9 0B C3 7D 08 05 10 51 C4 05 4E A9 60 97 C1 BE 8F 60 B0 AD 1B 8D A3 52 80 00 8B 4A 78 00 0B 00 02 01 00 00 0A 00 0A 00 08 EA EA 00 1D 00 17 00 18 00 2B 00 07 06 BA BA 03 04 03 03 00 2D 00 02 01 01 00 05 00 05 01 00 00 00 00 00 12 00 00 00 0D 00 12 00 10 04 03 08 04 04 01 05 03 08 05 05 01 08 06 06 01 00 17 00 00 FE 0D 00 DA 00 00 01 00 01 61 00 20 72 CB F8 82 32 F3 AB F6 83 16 66 B9 70 0F CE 53 3D 43 B0 09 A8 B4 2F 76 BB 7B D1 9E CF E3 C3 68 00 B0 EE A6 07 6C 1B 09 2A 52 79 82 A7 DE C8 25 0A 2D 86 04 54 F7 8D CC 74 70 09 A2 03 90 72 6B 93 51 6A 25 85 A3 1B 1F 02 AA DC 11 89 41 2F CC 69 40 C1 E7 37 51 4C 1E E7 6E 0B 1D FB 8A 68 77 2F BD BD 16 B9 53 5C FD B0 19 C3 DC E7 BA EA 2E 30 7A 60 D6 48 74 B8 A7 98 29 4E BD B0 B9 AF 59 98 35 CE 65 75 AC B3 62 67 ED C2 FE FB FE 26 75 B8 A8 1C 48 36 9A 2B 71 DC 44 0A 68 9E A0 22 6D BA BA ED A2 CE 0A 8A C7 C7 39 3F 20 49 F5 87 AB 58 5B BA C5 AC CC CE 6B B9 60 CF F6 B8 E3 4C AC 3B F3 50 0B 06 9A F4 46 D5 48 5E 99 F3 09 7F 33 7C 8F 00 10 00 0E 00 0C 02 68 32 08 68 74 74 70 2F 31 2E 31 44 69 00 05 00 03 02 68 32 00 23 00 00 00 1B 00 03 02 00 02 00 00 00 29 00 27 00 00 24 72 72 31 2D 2D 2D 73 6E 2D 6E 70 63 6E 78 75 2D 76 38 63 73 2E 67 6F 6F 67 6C 65 76 69 64 65 6F 2E 63 6F 6D FF 01 00 01 00 8A 8A 00 01 00 : ..'...#..O..j(....%..c.D[.U?N.........M<. .........a....p..y....D.6.....r.. .........+./.,.0............./.5....ZZ...3.+.)........ +.....}...Q..N.`....`.....R...Jx.....................+..........-....................................................a. r...2.....f.p..S=C..../v.{.....h.....l..*Ry....%.-..T...tp....rk.Qj%.........A/[email protected]/....S\.........0z`.Ht...)N....Y.5.eu..bg.....&u...H6.+q.D.h.."m.........9? I...X[.....k.`....L.;.P....F.H^..3|........h2.http/1.1Di.....h2.#............).'..$rr1---sn-npcnxu-v8cs.googlevideo.com.......... sending 1st out-of-order tcp segment 0-1 len=2 : 16 03 : .. packet: id=4 drop packet: id=5 len=52 mark=00000000 IP4: 198.18.174.52 => 64.233.162.157 proto=tcp ttl=62 sport=45596 dport=443 flags=A seq=3874068941 ack_seq=1436147959 packet: id=5 pass unmodified packet: id=6 len=631 mark=00000000 IP4: 198.18.174.52 => 64.233.162.157 proto=tcp ttl=62 sport=45596 dport=443 flags=AP seq=3874068941 ack_seq=1436147959 TCP: 16 03 01 02 3E 01 00 02 3A 03 03 40 A8 2C 7C 7F 82 44 E6 67 C9 98 71 E6 FF D7 15 90 66 47 B8 98 ... : ....>...:..@.,.D.g..q.....fG.. ... packet contains full TLS ClientHello hostname: googleads.g.doubleclick.net Checking include hostlist Hostlist check for googleads.g.doubleclick.net : negative Hostlist check for g.doubleclick.net : negative Hostlist check for doubleclick.net : negative Hostlist check for net : negative not applying tampering to this request packet: id=6 pass unmodified packet: id=7 len=60 mark=00000000 IP4: 10.18.172.26 => 173.194.222.95 proto=tcp ttl=61 sport=43068 dport=443 flags=S seq=2796197504 ack_seq=0 packet: id=7 pass unmodified packet: id=8 len=60 mark=00000000 IP4: 10.18.163.219 => 142.251.1.139 proto=tcp ttl=61 sport=53306 dport=443 flags=S seq=695946816 ack_seq=0 packet: id=8 pass unmodified packet: id=9 len=1420 mark=00000000 IP4: 10.18.165.63 => 173.194.73.113 proto=tcp ttl=126 sport=57071 dport=443 flags=AP seq=3071686489 ack_seq=1955024405 TCP: E4 A8 B3 BE BB 52 27 9B A4 E7 54 0C BF 00 C2 61 CC 9C 41 24 98 C0 39 CB CF D7 1F 29 D9 1C 86 39 ... : .....R'...T....a..A$..9....)...9 ... packet: id=9 pass unmodified packet: id=10 len=60 mark=00000000 IP4: 10.18.172.26 => 64.233.164.119 proto=tcp ttl=61 sport=45072 dport=443 flags=S seq=659446353 ack_seq=0 packet: id=10 pass unmodified packet: id=11 len=52 mark=00000000 IP4: 10.18.174.208 => 173.194.73.138 proto=tcp ttl=125 sport=55119 dport=443 flags=S seq=1314725451 ack_seq=0 packet: id=11 pass unmodified packet: id=12 len=52 mark=00000000 IP4: 10.18.100.30 => 173.194.73.139 proto=tcp ttl=125 sport=62710 dport=443 flags=S seq=2339900998 ack_seq=0 packet: id=12 pass unmodified packet: id=13 len=851 mark=00000000 IP4: 10.168.174.189 => 80.64.175.142 proto=tcp ttl=62 sport=57158 dport=443 flags=AP seq=125980530 ack_seq=2873066956 TCP: 16 03 01 03 1A 01 00 03 16 03 03 A4 93 7C FA 3E BF 83 1D D4 92 69 04 4E 80 4E 01 1B 0E DD 2F 1D ... : .............|.>.....i.N.N..../. ... packet contains full TLS ClientHello hostname: rr3---sn-npcnxu-v8cs.googlevideo.com Checking include hostlist Hostlist check for rr3---sn-npcnxu-v8cs.googlevideo.com : negative Hostlist check for googlevideo.com : positive dpi desync src=192.168.174.189:57158 dst=80.64.175.142:443 split pos 2 sending 2nd out-of-order tcp segment 2-798 len=797 seqovl=0 : 01 03 1A 01 00 03 16 03 03 A4 93 7C FA 3E BF 83 1D D4 92 69 04 4E 80 4E 01 1B 0E DD 2F 1D 12 6A 72 90 45 93 CB 58 9F 60 F0 20 E3 2C E1 23 C3 4C 71 86 6D 1C FB 92 42 7A E6 44 A0 BD 15 C1 0A 53 78 C4 45 BF 8D B5 BA 7A 83 BC 00 20 6A 6A 13 01 13 02 13 03 C0 2B C0 2F C0 2C C0 30 CC A9 CC A8 C0 13 C0 14 00 9C 00 9D 00 2F 00 35 01 00 02 AD 7A 7A 00 00 00 0D 00 12 00 10 04 03 08 04 04 01 05 03 08 05 05 01 08 06 06 01 00 1B 00 03 02 00 02 00 12 00 00 00 2B 00 07 06 4A 4A 03 04 03 03 00 2D 00 02 01 01 00 05 00 05 01 00 00 00 00 00 0B 00 02 01 00 00 00 00 29 00 27 00 00 24 72 72 33 2D 2D 2D 73 6E 2D 6E 70 63 6E 78 75 2D 76 38 63 73 2E 67 6F 6F 67 6C 65 76 69 64 65 6F 2E 63 6F 6D 00 17 00 00 FF 01 00 01 00 FE 0D 00 FA 00 00 01 00 01 F8 00 20 C2 3E F8 94 76 24 ED E2 CF 1F 73 D1 D3 C0 9E 13 0B C8 D1 CB BA DF 05 3F EE 2C F0 B5 2D 05 59 5A 00 D0 30 C1 AE 5A C5 88 6D 15 CA D8 F8 01 B9 38 4F 14 A1 71 D7 F2 58 F9 87 74 E6 E9 56 88 4C 87 34 A2 07 53 57 40 34 BA 27 65 6D D2 25 CF 7A 1F C4 00 47 38 22 7A 1C 58 70 FB 81 02 61 FA 3B 91 22 88 27 5F B9 4B 54 9C 6F BB C7 79 BB A0 FE 09 56 11 0A AB 8A E2 22 70 33 05 7A A3 BC 93 82 72 66 0C 63 75 6D 2E E1 3D 83 8D 40 D2 23 7F 61 9E 5E 2A 7C AC D9 59 73 C4 DA F8 BE 98 C1 F2 BD FC 0C 52 1E FB C2 9D BA 15 88 4D CE 52 6F C6 9B B4 F9 D3 24 BC 62 8C 78 ED C0 B9 B1 0C FE EE FB AF 62 B4 9C A9 3C 1A 27 96 B1 16 B4 53 36 F2 32 36 E5 14 E2 E2 A0 0E D7 5D BD 44 91 97 E8 B9 30 D5 4B 49 44 E2 5A 71 0A C4 59 1C 7E 8B DC B0 F3 22 5C DE 00 23 00 00 00 0A 00 0A 00 08 EA EA 00 1D 00 17 00 18 00 10 00 0E 00 0C 02 68 32 08 68 74 74 70 2F 31 2E 31 44 69 00 05 00 03 02 68 32 00 33 00 2B 00 29 EA EA 00 01 00 00 1D 00 20 17 E1 77 4A 8F EF 78 51 C8 99 EB A3 91 A8 1B E5 D4 BE B6 78 A7 1D 5C FA D3 5C 3A CF 97 3D A2 23 9A 9A 00 01 00 00 29 00 CF 00 AA 00 A4 57 9E BD 7E 70 17 4B 8A 7B A1 CC 6F 2A 2E 2A 66 6D 1B A2 B2 F8 8A 8C CC B9 01 E7 EE 15 24 F0 53 37 2D 28 08 43 F5 CF 60 9B C0 58 FF 38 28 8B 2E 31 80 B5 02 75 4F 21 82 6B 6C 30 6B 40 E7 51 AE 4A 6E C6 FF 8D B5 01 A3 A6 15 31 16 CB A3 1C 75 62 00 79 77 7F 71 78 7B 1C 8F C9 75 32 59 E5 D2 CC 4F D0 02 D4 69 C7 C8 0A 4A 80 52 0C 4B 8E 6F D2 6D D4 90 ED 83 A4 8A DF F9 90 19 26 54 32 00 D7 87 89 CA E5 2E 2B 08 90 8A B0 6B F3 84 EB 9C A8 C5 F5 00 08 84 3E E2 19 32 95 DF F8 E7 10 F3 45 FB 31 EA D0 6E 61 AC 00 21 20 C8 7E F9 AB 5C D0 8E 65 6A E0 7F D0 A6 20 56 93 1B C0 3F 66 9E E3 3B 0B 96 66 05 03 32 9E CD E6 : ...........|.>.....i.N.N..../..jr.E..X.`. .,.#.Lq.m...Bz.D.....Sx.E....z... jj.......+./.,.0............./.5....zz....................................+...JJ.....-......................).'..$rr3---sn-npcnxu-v8cs.googlevideo.com.................... .>..v$....s............?.,..-.YZ..0..Z..m......8O..q..X..t..V.L.4..SW@4.'em.%.z...G8"z.Xp...a.;.".'_.KT.o..y....V....."[email protected].^*|..Ys..........R.......M.Ro.....$.b.x.........b...<.'....S6.26.......].D....0.KID.Zq..Y.~...."\..#.......................h2.http/1.1Di.....h2.3.+.)........ ..wJ..xQ...........x..\..\:..=.#......)......W..~p.K.{..o*.*fm............$.S7-(.C..`..X.8([email protected]{...u2Y...O...i...J.R.K.o.m..........&T2.......+....k..........>..2......E.1..na..! .~..\..ej.. V...?f..;..f..2... sending 1st out-of-order tcp segment 0-1 len=2 : 16 03 : .. packet: id=13 drop packet: id=14 len=242 mark=00000000 IP4: 10.18.139.88 => 173.194.221.155 proto=tcp ttl=61 sport=51974 dport=443 flags=AP seq=2738114880 ack_seq=2300249536 TCP: 16 03 01 00 B9 01 00 00 B5 03 03 11 27 A8 7C 12 F8 C4 C1 9F 34 C6 6D 74 49 09 9E 24 F3 A5 E1 C0 ... : ............'.|.....4.mtI..$.... ... packet contains full TLS ClientHello hostname: www.googleadservices.com Checking include hostlist Hostlist check for www.googleadservices.com : negative Hostlist check for googleadservices.com : negative Hostlist check for com : negative not applying tampering to this request packet: id=14 pass unmodified packet: id=15 len=851 mark=00000000 IP4: 10.18.172.111 => 80.64.175.140 proto=tcp ttl=61 sport=36242 dport=443 flags=AP seq=1106288807 ack_seq=150208219 TCP: 16 03 01 03 1A 01 00 03 16 03 03 48 E1 E9 96 5D 73 2B 74 1E EC 1A DC AE 8C 13 95 89 8B 4F B8 2E ... : ...........H...]s+t..........O.. ... packet contains full TLS ClientHello hostname: rr1---sn-npcnxu-v8cs.googlevideo.com Checking include hostlist Hostlist check for rr1---sn-npcnxu-v8cs.googlevideo.com : negative Hostlist check for googlevideo.com : positive dpi desync src=10.18.172.111:36242 dst=80.64.175.140:443 split pos 2 sending 2nd out-of-order tcp segment 2-798 len=797 seqovl=0 : 01 03 1A 01 00 03 16 03 03 48 E1 E9 96 5D 73 2B 74 1E EC 1A DC AE 8C 13 95 89 8B 4F B8 2E AB 5B FF F8 F2 E1 EA BB 7E 2F 53 20 2C 90 BA 68 E1 A9 00 42 12 C6 BA F9 98 9B 19 E8 6F 04 FF 9E 76 93 DB CA 47 AB D8 37 F5 EC 08 D6 00 20 FA FA 13 01 13 02 13 03 C0 2B C0 2F C0 2C C0 30 CC A9 CC A8 C0 13 C0 14 00 9C 00 9D 00 2F 00 35 01 00 02 AD 3A 3A 00 00 00 10 00 0E 00 0C 02 68 32 08 68 74 74 70 2F 31 2E 31 00 12 00 00 00 2D 00 02 01 01 FE 0D 00 FA 00 00 01 00 01 6E 00 20 3F B6 9E E0 56 F1 8F 00 8E 97 32 4C 47 26 B4 1C 40 41 99 16 B6 EB 02 D3 D7 78 63 6D 1D 8B 3D 36 00 D0 E0 A9 7F F1 6A 15 90 38 3E 77 F9 EF 20 32 C8 4E CB BA 11 80 29 28 BE 15 79 9C 18 40 6D 51 01 18 EC 94 46 CA 43 78 75 C1 AB 44 A0 5E 8D 35 34 73 08 7A 49 4B A7 C5 98 4F B7 71 CA 06 81 A4 90 B3 A8 BD DF BC CB B1 EB AB 68 42 30 A3 6C 2C 11 2F 8D 8B 43 B0 2C 44 58 AD 9C 5C 14 69 53 41 43 2D 8C B9 9A D0 6A 6A D2 1D AA 22 52 8B 4A 36 BB BF 8F 5C 4F C8 91 09 AB 7C 59 D0 51 17 95 E5 7C AC 20 A3 F0 5D 21 8D 1C 34 26 E0 91 13 A4 95 6C D7 EB A1 94 56 A1 22 35 82 AE 6B 0F 88 6E A3 0E A7 2C AC 02 DE 40 63 9A 7E 12 5C 43 45 FC 59 61 E5 32 8B CF 57 68 83 6A 8E C9 E0 E1 06 B5 EE F7 D7 0D 9F E3 AF B8 D6 C6 13 B2 7F 8C 90 2F D5 46 22 00 0B 00 02 01 00 00 00 00 29 00 27 00 00 24 72 72 31 2D 2D 2D 73 6E 2D 6E 70 63 6E 78 75 2D 76 38 63 73 2E 67 6F 6F 67 6C 65 76 69 64 65 6F 2E 63 6F 6D 44 69 00 05 00 03 02 68 32 00 05 00 05 01 00 00 00 00 00 0A 00 0A 00 08 4A 4A 00 1D 00 17 00 18 00 0D 00 12 00 10 04 03 08 04 04 01 05 03 08 05 05 01 08 06 06 01 00 2B 00 07 06 EA EA 03 04 03 03 FF 01 00 01 00 00 33 00 2B 00 29 4A 4A 00 01 00 00 1D 00 20 42 A9 E4 75 BB EA 2E 51 A2 C6 72 24 FB 92 38 41 33 9F 45 51 4C BF 54 B8 3E B7 1E 6F 9E EB CC 35 00 1B 00 03 02 00 02 00 17 00 00 00 23 00 00 EA EA 00 01 00 00 29 00 CF 00 AA 00 A4 57 9E BD 7E 70 17 4B 8A 7B A1 CC 6F 2A 2E 2A 66 71 8F 63 45 EA 84 E3 D4 FC C4 0B 77 2A 12 99 0E 94 27 D8 D3 C8 4C EB F7 6C C0 2F 06 46 0F 18 4C AE F2 C2 D4 68 C4 F4 E1 76 6B 06 FE 6C 53 AC E8 70 2D 82 79 E4 08 AF 44 F5 3A 82 36 75 F1 06 3E 32 97 74 E2 F5 0D D7 15 17 13 4A F8 DE 67 B1 AD F6 64 AC 33 1C 34 D4 96 A4 70 57 BD EB 03 AC 7F DB AF 39 A3 B6 22 14 20 51 A4 09 61 99 99 3C 9C 2A 3C AA BC B7 25 E1 6E B6 11 83 40 97 23 83 26 D8 A0 FB 80 75 01 87 09 0B AF C6 CB 86 84 A6 C2 AF 6B 28 0D C8 EB 74 CD 00 21 20 00 D7 EF 15 EC 9F 59 4D BE 7B D6 49 98 63 76 32 E2 BB 3A A2 42 C2 AF F2 98 67 C2 89 6D E7 32 85 : .........H...]s+t..........O...[......~/S ,..h...B........o...v...G..7..... .........+./.,.0............./.5....::.........h2.http/1.1.....-.............n. ?...V.....2LG&[email protected]..=6....j..8>w.. 2.N....)([email protected].^.54s.zIK...O.q..............hB0.l,./..C.,DX..\.iSAC-....jj..."R.J6...\O....|Y.Q...|. ..]!..4&.....l....V."5..k..n...,...@c.~.\CE.Ya.2..Wh.j.................../.F".........).'..$rr1---sn-npcnxu-v8cs.googlevideo.comDi.....h2...............JJ.............................+...............3.+.)JJ...... B..u...Q..r$..8A3.EQL.T.>..o...5............#........)......W..~p.K.{..o*.*fq.cE.......w*....'...L..l./.F..L....h...vk..lS..p-.y...D.:.6u..>2.t.......J..g...d.3.4...pW.....9..". Q..a..<.*<...%.n...@.#.&....u............k(...t..! ......YM.{.I.cv2..:.B....g..m.2. sending 1st out-of-order tcp segment 0-1 len=2 : 16 03 : .. packet: id=15 drop packet: id=16 len=76 mark=00000000

итд...

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

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

Что-то у меня вызвает сомнение достоверность этих данных.
Ладно, если бы SO либы от нетлинка собирались с исходников вместе с чекером.
Но там используются системные so. Значит чекер никак не мог вписать туда свой код.
nfq_set_mode никакие буфера не передает на вход.
Они формируются внутри либы.
И каким образом тогда чекер решает, что данные неинициализированы ?
Предположим, он перехватил syscall. Видит какие-то байты на входе.
Получается, он должен сравнивать их с каким-то паттерном, который он, предположительно, записал до вызова в стек.
Об этом мы выше уже говорили на счет сравнения паттернов

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

Или я что-то неверно понимаю, или выходит nfq_cb ... rawsend
выполняется еще до надписи Loading hostlist /etc/zapret/allow-domains.txt ?
Это невозможно в принципе до инициализации и запуска процессинга цикла очереди.

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

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

01 00 01 00 8A 8A 00 01 00
01 00 01 00 5A 5A 00 01 00

скорее всего он сечет вот это

@anphsw
Copy link
Contributor Author

anphsw commented Aug 28, 2024

Про паттерны я не уверен на 100%, возможно они и есть, хотя я не нашел упоминания о них.
Да, это скорее всего fflush тогда.
nfqws без трафика (номер очереди отличный от того, что написан в iptables) выглядит так:

==10584== Memcheck, a memory error detector
==10584== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==10584== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==10584== Command: /tmp/zapret-nfqws-debug --user=nobody --qnum=220 --dpi-desync=disorder2 --hostlist=/etc/zapret/allow-domains.txt --debug=1
==10584== 
==10584== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==10584==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==10584==    by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0)
==10584==    by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0)
==10584==    by 0x4846BD0: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==10584==    by 0x119E68: nfq_main (nfqws.c:176)
==10584==    by 0x11C991: main (nfqws.c:1767)
==10584==  Address 0xbed45079 is on thread 1's stack
==10584==  Uninitialised value was created by a stack allocation
==10584==    at 0x4846B56: ??? (in /usr/lib/libnetfilter_queue.so.1.3.0)
==10584== 
==10584== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==10584==    at 0x49622E2: sendto (in /tmp/debug/lib/libc-2.22.so)
==10584==    by 0x484FB7D: nfnl_send (in /usr/lib/libnfnetlink.so.0.2.0)
==10584==    by 0x4852103: nfnl_query (in /usr/lib/libnfnetlink.so.0.2.0)
==10584==    by 0x48472D5: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0)
==10584==    by 0x119F5E: nfq_main (nfqws.c:195)
==10584==    by 0x11C991: main (nfqws.c:1767)
==10584==  Address 0xbed45079 is on thread 1's stack
==10584==  in frame #3, created by nfq_set_mode (???:)
==10584==  Uninitialised value was created by a stack allocation
==10584==    at 0x4847256: nfq_set_mode (in /usr/lib/libnetfilter_queue.so.1.3.0)
==10584== 
PR_SET_NO_NEW_PRIVS(prctl): Invalid argument
==10584== 
==10584== Process terminating with default action of signal 2 (SIGINT)
==10584==    at 0x4961FF6: recv (in /tmp/debug/lib/libc-2.22.so)
==10584==    by 0x11A143: nfq_main (nfqws.c:233)
==10584==    by 0x11C991: main (nfqws.c:1767)
Loading hostlist /etc/zapret/allow-domains.txt
loading plain text list
Loaded 11 hosts from /etc/zapret/allow-domains.txt
initializing conntrack with timeouts tcp=60:300:60 udp=60
opening library handle
unbinding existing nf_queue handler for AF_INET (if any)
binding nfnetlink_queue as nf_queue handler for AF_INET
binding this socket to queue '220'
setting copy_packet mode
initializing raw sockets bind-fix4=0 bind-fix6=0
set_socket_buffers fd=4 rcvbuf=2048 sndbuf=32768
fd=4 SO_RCVBUF=4096
fd=4 SO_SNDBUF=65536
set_socket_buffers fd=5 rcvbuf=2048 sndbuf=32768
fd=5 SO_RCVBUF=4096
fd=5 SO_SNDBUF=65536
Running as UID=102 GID=102
set_socket_buffers fd=3 rcvbuf=65536 sndbuf=32768
fd=3 SO_RCVBUF=131072
fd=3 SO_SNDBUF=65536
==10584== 
==10584== HEAP SUMMARY:
==10584==     in use at exit: 1,444 bytes in 30 blocks
==10584==   total heap usage: 86 allocs, 56 frees, 8,160 bytes allocated
==10584== 
==10584== LEAK SUMMARY:
==10584==    definitely lost: 0 bytes in 0 blocks
==10584==    indirectly lost: 0 bytes in 0 blocks
==10584==      possibly lost: 0 bytes in 0 blocks
==10584==    still reachable: 1,444 bytes in 30 blocks
==10584==         suppressed: 0 bytes in 0 blocks
==10584== Reachable blocks (those to which a pointer was found) are not shown.
==10584== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==10584== 
==10584== For lists of detected and suppressed errors, rerun with: -s
==10584== ERROR SUMMARY: 4 errors from 2 contexts (suppressed: 0 from 0)

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

Не, неправ. Это не мусор.
Взял эти hex дампы. Склеил 2 куска disorder. Отправил netcat-ом , зацепил в wireshark.
Смотрю ClientHello
Все нормально там. Мусора не вижу. И длина полностью соответствует заголовкам TLS.

Однако, это не полный пакет, идущий в sendto. Только L4 data payload

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

Все, кажется понял в чем дело.
Сам забил паттерном пакет, потом дампанул в шарке. Вижу куски этого паттерна.
Не заполнятся некоторые поля ip header.
qos и checksum

@anphsw
Copy link
Contributor Author

anphsw commented Aug 28, 2024

По факту memset на всю pktlen срабатывание убирает.
Могу попробовать сделать memset не на пакет, а на какие-то отдельные участки, только тогда надо указать какие наиболее вероятны.

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

Фикс залил, можно проверять.
ip6hdr , tcphdr, udphdr проверил. все поля заполняются

@anphsw
Copy link
Contributor Author

anphsw commented Aug 28, 2024

Проверил, ошибка ушла.
С остальными так понимаю, что никак не разобраться, т.к. они в библиотеке уже.
Во всяком случае я не нашел, что бы такого не инициализированого передавалось в nfqws.c:176 и nfqws.c:195

@bol-van
Copy link
Owner

bol-van commented Aug 28, 2024

В либах без разницы. Это только netlink сокеты. Прямое общение процесса с ядром.
Никуда не уходит. Если некоторые поля не заполнены , и они реально не нужны. то проблемы нет

@anphsw
Copy link
Contributor Author

anphsw commented Sep 22, 2024

Подумалась тут такая вещь: мы инициализируем ip->ip_tos = 0, но правильнее было бы брать tos из исходного пакета, т.к. у некоторых на нем может быть построена какая-то логика (отправка в соответствующий канал, шейпер, итд)
В принципе никаких больше проблем не нашел, работает стабильно на достаточно большом трафике.

@bol-van
Copy link
Owner

bol-van commented Sep 22, 2024

В общем да, согласен. Лучше брать из исходного.
Если шейпер - это еще ничего. nfqws генерит достаточно мало пакетов при правильной настройке (если кто-то не указал desync any protocol на всю катушку).
Но могут построить и какие-то ip rules или ip/nf tables

@bol-van
Copy link
Owner

bol-van commented Sep 22, 2024

Стоит еще протестировать последний мажорный апдейт с профилями.
там многое переписано, рефакторинг серьезный

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants