Bug di ESP-IDF: MDNS, Wireshark dan apa hubungannya unicorn dengannya

Halo. Saya melakukan pengembangan IoT komersial, kami terutama menggunakan modul dari Espressif - ESP8266 dan ESP32.

Sebagai bagian dari makanan anjing , terkadang kita membawa pulang produk kita dan menggunakannya dalam kehidupan kita sehari-hari. Dan kemudian, suatu hari, salah satu karyawan menerima keluhan: setelah menginstal firmware uji baru pada perangkat, jaringan rumahnya pertama-tama mulai mengalami gangguan parah dan macet, dan kemudian situasinya kembali normal, tetapi perangkat kami tidak lagi terlihat baik di jaringan lokal atau di cloud ...

Ada semacam keruntuhan. Tapi yang mana? Di jaringan lain, kami tidak mengamati perilaku seperti itu, jadi diputuskan untuk mendaratkan pasukan pengintai sebagai diriku, dilengkapi dengan semua yang diperlukan, kepada petugas.

Badan intelijen

Untuk memulainya, saya memutuskan untuk mengumpulkan jumlah data maksimum tentang situasi di tahap terminalnya. Tanpa me-reboot perangkat, saya memulai Wireshark dalam Mode Monitor, mengatur pemfilteran pada alamat MAC perangkat. Ternyata perangkat yakin bahwa jaringannya teratur - dengan keras kepala mengirim beberapa data ke router, tetapi router tidak membalasnya. Hmm, mencurigakan.

Di panel admin router, perangkat juga terlihat terhubung. Tapi kenapa tidak ada tanggapan? Saya mendapat jawaban untuk pertanyaan ini ketika saya memutuskan untuk menghubungkan perangkat lain ke router yang sama (lebih tepatnya, salah satu devkit saya ), dan menghapus pemfilteran di Wireshark. Ternyata alamat MAC router telah berubah! Hmm, mencurigakan . Itu benar-benar berubah satu bit terakhir, sementara teknik lainnya menyadari substitusi ini, tetapi perangkat kami tidak, dan terus-menerus mengirim data ke alamat poppy lama, yang, tentu saja, tidak ada yang mendengarkan.

, . . , MAC "" ? , MAC . " ", . , . , , Wireshark , .

- . , , . ... Wireshark . , - , , . , , , .

And the winner is... 99% MDNS. , , ( , " ", Amazon). ? - , "/" ( ) . , .

:

  1. multicast- MDNS, .

  2. collision-query- ANY "", , -, "".

  3. collision-query- multicast-, .

  4. advertise- PTR, SRV, TXT A/AAAA multicast- MDNS, , .

  5. advertise- multicast-, .

  6. 2-5 .

, - multicast . ? , , . .

diff. , , . , . ... , 0.9 0.10. ? ... , . , MDNS.

Debugger? printf!

? : mdns.c. _mdns_create_probe_packet. , ( ), #2917 mdns_parse_packet. . _mdns_check_txt_collision. : , advertise, TXT-, TXT. ! , . , .

size_t data_len = 1;
if (len == 1 && service->txt) {
  return -1;//we win
} else if (len > 1 && !service->txt) {
  return 1;//they win
} else if (len == 1 && !service->txt) {
  return 0;//same
}

data_len, TXT- service. - .

mdns_txt_linked_item_t * txt = service->txt;
while (txt) {
  data_len += 2 + strlen(service->txt->key) + strlen(service->txt->value);
  txt = txt->next;
}

if (len > data_len) {
  return 1;//they win
} else if (len < data_len) {
  return -1;//we win
}

, TXT , , .

uint8_t ours[len];
uint16_t index = 0;
char * tmp;

txt = service->txt;
while (txt) {
  tmp = (char *)malloc(2 + strlen(txt->key) + strlen(txt->value));
  if (tmp) {
    sprintf(tmp, "%s=%s", txt->key, txt->value);
    _mdns_append_string(ours, &index, tmp);
    free(tmp);
  } else {
    HOOK_MALLOC_FAILED;
    // continue
  }
  txt = txt->next;
}

int ret = memcmp(ours, data, len);
if (ret > 0) {
  return -1;//we win
} else if (ret < 0) {
  return 1;//they win
}
return 0;//same

TXT , ( ), .

? , . , printf.

"" , . ? "" ( 10 ) ""! .

mdns_txt_linked_item_t * txt = service->txt;
while (txt) {
  data_len += 2 + strlen(service->txt->key) + strlen(service->txt->value);
  txt = txt->next;
}

, linked-list. , key value... . service->txt? , ...

, - (, git blame, ), . ? : . TXT-, , , N. , , , - , . ? , MDNS... .

?

issue ESP-IDF , , .

: SDK? , ( - submodule). - , , ...? , , .

?

@Andrey2008 PVS-Studio. , PVS-Studio, . , , , ... - .

?

, data flow PVS-Studio linked-list. - ( ). , - , .




All Articles