Bitte macht das nicht nach – Bughunting mit Tools

Vor ein paar Tagen gab es die Nachricht, daß u.a. Curl mit ChatGPT generierten Fehlerberichten zu gespammt wird, die nur völlig nutzlose Zeitverschwendung darstellt, weil die Tools Sachen falsch einschätzen. Das ist Exim jetzt auch passiert.

Bitte macht das nicht nach – Bughunting mit Tools

An sich ist es eine super Sache, daß sich Menschen um die Sicherheit Ihrer Produkte Gedanken machen und aktiv helfen wollen, bei Problemen einzugreifen. Leider machen einige Tools den Entwicklern von OpenSource Projekten das Leben schwer ( siehe Curl ).

Auch wenn im Pullrequest kein ChatGPT drin war, mußte sich jemand heute um so eine Zeitverschwendungsmeldung kümmern. In diesem Fall war das Ich und das Projekt um das es ging Exim:

Damit alle Verstehen um was es geht:

Exim ist in C programmiert, eine Sprache die schon in den 70er benutzt wurde. Dem entsprechend sind die Standard-Funktionen extrem „schmal“ und ohne Rechenzeitverbrennung programmiert worden, meint: Geschwindigkeit war wichtiger als Sicherheit, weil es „noch keine Exploits gab“ und, hauptsächlich, die CPUs weniger leisten konnten.

strcpy() ist eine eingebaute C-Funktion die Inhalte von Speicher A in Speicher B kopiert, bis diese auf eine 0 trifft.  Die binäre Null also 0x00 gilt in C als Stringterminator, also das Ende eines Textstrings. (Das ging genau so lange gut, bis UTF kam , aber das ist eine andere Geschichte.) strcpy(ZIEL,QUELLE) kopiert also genau solange Bytes von der Quelle ins Ziel, bis ein 0x00 kommt, EGAL ob der Speicherbereich „ZIEL“ ausreichend groß ist, um die kopierte Datenanzahl aufzunehmen. Wenn er es nicht ist, kommt es zum BUFFER-OVERFLOW und damit zu potentiellen Remote-Code-Executions, aber meistens nur zum Programmabsturz.

strncpy() ist eine Funktion, die genau das gleiche macht wie strcpy() nur, daß fest vorgegeben wird, wie viel kopiert werden kann, was das überschreiben des Zielspeichers verhindert, außer man gibt da einfach quatsch als Länge an, dann natürlich nicht mehr 😉

Beim Pullrequest im Eximsource gings um

  if ((int)strlen(pw->pw_dir) + (int)strlen(filename) + 1 > sizeof(buffer))
    {
    printf("exim_lock: expanded file name %s%s is too long", pw->pw_dir,
      filename);
    exit(EXIT_FAILURE);
    }

  strcpy(buffer, pw->pw_dir);
  strcat(buffer, filename);
  filename = buffer;
}

. Das sollte so ersetzt werden:

– strcpy(buffer, pw->pw_dir);
+ strncpy(buffer, pw->pw_dir);

Leider braucht strncpy() 3 Argumente, nämlich auch die Größe des Zielspeichers:

char *strncpy(char dst[restrict .dsize], const char *restrict src, size_t dsize);

Wenn man da nur 2 Argumente liefert, schlägt das Kompilieren des Sources fehl, außer irgendeine Compiler Magie erkennt die Funktion und füllt den dritten Parameter heimlich auf. Sich darauf zu verlassen ist genauso fahrlässig, wie noch strcpy() zu benutzen, ohne vorher geprüft zu haben, ob das sicher klappen kann.

Die Eximdevs haben das aber bereits richtig gemacht:

  if ((int)strlen(pw->pw_dir) + (int)strlen(filename) + 1 > sizeof(buffer))
    {
    printf("exim_lock: expanded file name %s%s is too long", pw->pw_dir,
      filename);
    exit(EXIT_FAILURE);
    }

  strcpy(buffer, pw->pw_dir);
  strcat(buffer, filename);
  filename = buffer;
}

Der Test steht nur,Sourcecode bedingt, etwas weiter davon weg, weil man keine If-Than-Else Anweisung benutzt hat, sondern eine If-Not-Error Anweisung gemacht hat.  Es wird also der Fehlerfall abgefragt und dann ein Fehler ausgegeben,statt abzufragen ob das funktionieren kann, es dann zu tun und ANSONSTEN einen Fehler auszugeben.

Das ist völlig legitim, auch wenn ich persönlich das nicht so gemacht hätte, weil es dem Compiler erlaubt, etwas einfacheren Programmcode zu erzeugen.

Bitte nicht nachmachen

Wie Ihr oben selbst sehen könnt, ist alles ok gewesen. Irgendein Tool wird über strcpy() gestolpert sein und das routinemäßig der Person vor dem Monitor mitgeteilt haben. Die hatte aber keine Lust nachzusehen, ob überhaupt ein Problem vorliegt, oder keinen Plan davon, wie C funktioniert ( übrigens nicht meine Lieblingssprache 😉 ) und es dann einfach gemeldet.

Bitte macht das nicht nach! Das kostet uns als Entwickler einfach nur unnötige Zeit. Nehmt das Ergebnis und analysiert selbst nach, ob es überhaupt ein Problem gibt. Da haben alle was von, weil Ihr lernt was dazu, egal wie die Sache ausgeht, und ggf. habt Ihr auch ein Problem gefunden, das wirklich gelöst werden muß.

Beispiel:

Wenn ich …

char *ziel[500];
char *quellel[200];

memset(quelle,0,200);
strcpy(ziel,quelle);
return;

… habe, würde so ein Tool das strcpy() reklamieren, es könnte aber NIEMALS ein Problem darstellen. Wer als Mensch den Code sieht, versteht das auch, das Tool hat aber nur „grep ’strcpy(‚ sourcefile.c“ gemacht. Zum Problem wird so etwas hier:

function a(char* quelle) {

  char *ziel[500];
  strcpy(ziel,quelle);
  return;
}

Weil nichts über die Quelle, deren wahre Länge und Inhalt usw. bekannt ist. Hier muß man jetzt tatsächlich mit strncpy() arbeiten, um seinen Speicherbereich zu schützen:

function a(char* quelle) {

  char *ziel[500];
  strncpy(ziel,quelle,sizeof(ziel));
  return;
}

Und jetzt viel Spaß beim C lernen 😉

 

Linux am Dienstag – Programm für den 17.12.2024

Diesmal beim letzten Linux am Dienstag des Jahres 2024 … „Rick, müssen wir wirklich zu Marius in die Sendung?“ „ja, Morty ich fürchte schon.“ „Oh, Mein Gott.“

Linux am DienstagProgramm für den 17.12.2024

u.a. im Programm am 17.12.2024, ab 19 Uhr :

  • Linux – Jugendschutz verlangt Altersfilter in Betriebssystemen
  • Sicherheit – MFA von Microsoft durch massive Parallelität geknackt
  • Sicherheit – Schwere Lücke in OpenWRT
  • Linux – Spaß mit Sprache (Marius)
  • Linux – Neues Stealthrootkit aufgetaucht

und andere IT-Newsbeiträge aus aller Welt. Wie jede Woche per Videokonferenz auf https://meet.cloud-foo.de/Linux .

Hinweis: Die bisherigen Vorträge findet man unter https://linux-am-dienstag.de/archiv/ .

Fedora Kernel 6.11.11 crasht auf einigen Geräten beim Booten

Treue Leser wissen, daß ich ein TerraPad Tablet mit Linux drauf habe. Da wurde der neue Kernel 6.11.11 gebootet, was in einem fatalen Misserfolg geendet hat:

Dez 13 01:42:14 fedora kernel: watchdog: BUG: soft lockup – CPU#9 stuck for 52s! [kworker/9:4:347]
Dez 13 01:42:14 fedora kernel: CPU#9 Utilization every 4s during lockup:
Dez 13 01:42:14 fedora kernel: #1: 101% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #2: 100% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #3: 100% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #4: 100% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #5: 101% system, 0% softirq, 1% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: Modules linked in: nf_conntrack_netbios_ns nf_conntrack_broadcast nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip_set nf_tables qrtr sunrpc bnep binfmt_misc vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl snd_sof_intel_hda_generic soundwire_intel soundwire_cadence snd_sof_intel_hda_common snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci snd_sof_xtensa_dsp iwlmvm snd_sof snd_hda_codec_hdmi snd_sof_utils snd_soc_hdac_hda snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi soundwire_bus snd_hda_codec_realtek snd_soc_avs mac80211 snd_hda_codec_generic snd_soc_hda_codec snd_hda_ext_core snd_hda_scodec_component snd_soc_core intel_uncore_frequency intel_uncore_frequency_common libarc4 x86_pkg_temp_thermal snd_compress intel_powerclamp ac97_bus snd_pcm_dmaengine coretemp snd_hda_intel snd_intel_dspcfg kvm_intel snd_intel_sdw_acpi intel_ipu6_isys snd_hda_codec
Dez 13 01:42:14 fedora kernel: btusb videobuf2_dma_contig btrtl videobuf2_memops videobuf2_v4l2 kvm snd_hda_core iwlwifi videobuf2_common snd_hwdep btintel iTCO_wdt spi_nor snd_seq intel_pmc_bxt btbcm snd_seq_device mtd mei_pxp mei_hdcp iTCO_vendor_support rapl btmtk joydev intel_rapl_msr snd_pcm processor_thermal_device_pci cfg80211 processor_thermal_device intel_cstate bluetooth snd_timer processor_thermal_wt_hint intel_uncore snd spi_intel_pci wmi_bmof i2c_i801 mei_me processor_thermal_rfim pcspkr i2c_smbus soundcore spi_intel idma64 processor_thermal_rapl mei mxc4005 rtsx_usb_ms intel_ipu6 rfkill intel_rapl_common industrialio_triggered_buffer processor_thermal_wt_req ipu_bridge memstick kfifo_buf igen6_edac processor_thermal_power_floor processor_thermal_mbox industrialio goodix_ts int3403_thermal intel_skl_int3472_tps68470 soc_button_array int340x_thermal_zone ov2740 v4l2_fwnode intel_pmc_core tps68470_regulator v4l2_async clk_tps68470 intel_hid intel_vsec int3400_thermal sparse_keymap dptf_power pmt_telemetry acpi_thermal_rel
Dez 13 01:42:14 fedora kernel: intel_skl_int3472_discrete pmt_class acpi_tad acpi_pad v4l2loopback(OE) videodev mc loop nfnetlink zram dm_crypt xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec mmc_block rtsx_usb_sdmmc mmc_core rtsx_usb i915 crct10dif_pclmul crc32_pclmul crc32c_intel i2c_algo_bit polyval_clmulni drm_buddy polyval_generic ttm nvme ghash_clmulni_intel drm_display_helper sha512_ssse3 nvme_core sha256_ssse3 sha1_ssse3 cec nvme_auth video wmi pinctrl_tigerlake serio_raw i2c_dev fuse
Dez 13 01:42:14 fedora kernel: CPU: 9 UID: 0 PID: 347 Comm: kworker/9:4 Tainted: G D W OEL 6.11.11-300.fc41.x86_64 #1
Dez 13 01:42:14 fedora kernel: Tainted: [D]=DIE, [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE, [L]=SOFTLOCKUP
Dez 13 01:42:14 fedora kernel: Hardware name: Wortmann_AG 1220142;1470536/S1203i512, BIOS WHJ-BI-123-SF133ALR110-S8GB-328-G 10/31/2023
Dez 13 01:42:14 fedora kernel: Workqueue: events netstamp_clear
Dez 13 01:42:14 fedora kernel: RIP: 0010:smp_call_function_many_cond+0x12b/0x540
Dez 13 01:42:14 fedora kernel: Code: 36 48 63 e8 49 8b 1c 24 48 81 fd 00 20 00 00 0f 83 db 03 00 00 48 03 1c ed 20 1e cc b2 8b 53 08 48 89 de 83 e2 01 74 0a f3 90 <8b> 4e 08 83 e1 01 75 f6 83 c0 01 eb af 48 83 c4 38 5b 5d 41 5c 41
Dez 13 01:42:14 fedora kernel: RSP: 0000:ffffc22040533d70 EFLAGS: 00000202
Dez 13 01:42:14 fedora kernel: RAX: 0000000000000001 RBX: ffff9cdb8f6bee20 RCX: 0000000000000001
Dez 13 01:42:14 fedora kernel: RDX: 0000000000000001 RSI: ffff9cdb8f6bee20 RDI: ffff9cda0018cc58
Dez 13 01:42:14 fedora kernel: RBP: 0000000000000001 R08: 0000000000000001 R09: ffff9cda0018c040
Dez 13 01:42:14 fedora kernel: R10: 0000000000000007 R11: 0000000000000000 R12: ffff9cdb8fab7b00
Dez 13 01:42:14 fedora kernel: R13: ffff9cda0018c040 R14: 0000000000000009 R15: 0000000000000001
Dez 13 01:42:14 fedora kernel: FS: 0000000000000000(0000) GS:ffff9cdb8fa80000(0000) knlGS:0000000000000000
Dez 13 01:42:14 fedora kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Dez 13 01:42:14 fedora kernel: CR2: 0000557beae29360 CR3: 00000001f442a000 CR4: 0000000000f50ef0
Dez 13 01:42:14 fedora kernel: PKRU: 55555554
Dez 13 01:42:14 fedora kernel: Call Trace:
Dez 13 01:42:14 fedora kernel: <IRQ>
Dez 13 01:42:14 fedora kernel: ? watchdog_timer_fn.cold+0x233/0x311
Dez 13 01:42:14 fedora kernel: ? __pfx_watchdog_timer_fn+0x10/0x10
Dez 13 01:42:14 fedora kernel: ? __hrtimer_run_queues+0x113/0x280
Dez 13 01:42:14 fedora kernel: ? ktime_get+0x3e/0xf0
Dez 13 01:42:14 fedora kernel: ? hrtimer_interrupt+0xfa/0x210
Dez 13 01:42:14 fedora kernel: ? __sysvec_apic_timer_interrupt+0x52/0x100
Dez 13 01:42:14 fedora kernel: ? sysvec_apic_timer_interrupt+0x6c/0x90
Dez 13 01:42:14 fedora kernel: </IRQ>
Dez 13 01:42:14 fedora kernel: <TASK>
Dez 13 01:42:14 fedora kernel: ? asm_sysvec_apic_timer_interrupt+0x1a/0x20
Dez 13 01:42:14 fedora kernel: ? smp_call_function_many_cond+0x12b/0x540
Dez 13 01:42:14 fedora kernel: ? __pfx_do_sync_core+0x10/0x10
Dez 13 01:42:14 fedora kernel: on_each_cpu_cond_mask+0x24/0x40
Dez 13 01:42:14 fedora kernel: text_poke_bp_batch+0xc1/0x300
Dez 13 01:42:14 fedora kernel: ? arch_jump_label_transform_queue+0x57/0x80
Dez 13 01:42:14 fedora kernel: text_poke_finish+0x1f/0x30
Dez 13 01:42:14 fedora kernel: arch_jump_label_transform_apply+0x1a/0x30
Dez 13 01:42:14 fedora kernel: static_key_enable_cpuslocked+0x63/0x90
Dez 13 01:42:14 fedora kernel: static_key_enable+0x1a/0x20
Dez 13 01:42:14 fedora kernel: process_one_work+0x176/0x330
Dez 13 01:42:14 fedora kernel: worker_thread+0x252/0x390
Dez 13 01:42:14 fedora kernel: ? __pfx_worker_thread+0x10/0x10
Dez 13 01:42:14 fedora kernel: kthread+0xcf/0x100
Dez 13 01:42:14 fedora kernel: ? __pfx_kthread+0x10/0x10
Dez 13 01:42:14 fedora kernel: ret_from_fork+0x31/0x50
Dez 13 01:42:14 fedora kernel: ? __pfx_kthread+0x10/0x10
Dez 13 01:42:14 fedora kernel: ret_from_fork_asm+0x1a/0x30
Dez 13 01:42:14 fedora kernel: </TASK>
Dez 13 01:42:14 fedora kernel: watchdog: BUG: soft lockup – CPU#8 stuck for 48s! [rcu_exp_gp_kthr:20]
Dez 13 01:42:14 fedora kernel: CPU#8 Utilization every 4s during lockup:
Dez 13 01:42:14 fedora kernel: #1: 101% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #2: 100% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #3: 100% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #4: 100% system, 0% softirq, 1% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: #5: 101% system, 0% softirq, 0% hardirq, 0% idle
Dez 13 01:42:14 fedora kernel: Modules linked in: nf_conntrack_netbios_ns nf_conntrack_broadcast nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip_set nf_tables qrtr sunrpc bnep binfmt_misc vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl snd_sof_intel_hda_generic soundwire_intel soundwire_cadence snd_sof_intel_hda_common snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci snd_sof_xtensa_dsp iwlmvm snd_sof snd_hda_codec_hdmi snd_sof_utils snd_soc_hdac_hda snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi soundwire_bus snd_hda_codec_realtek snd_soc_avs mac80211 snd_hda_codec_generic snd_soc_hda_codec snd_hda_ext_core snd_hda_scodec_component snd_soc_core intel_uncore_frequency intel_uncore_frequency_common libarc4 x86_pkg_temp_thermal snd_compress intel_powerclamp ac97_bus snd_pcm_dmaengine coretemp snd_hda_intel snd_intel_dspcfg kvm_intel snd_intel_sdw_acpi intel_ipu6_isys snd_hda_codec
Dez 13 01:42:14 fedora kernel: btusb videobuf2_dma_contig btrtl videobuf2_memops videobuf2_v4l2 kvm snd_hda_core iwlwifi videobuf2_common snd_hwdep btintel iTCO_wdt spi_nor snd_seq intel_pmc_bxt btbcm snd_seq_device mtd mei_pxp mei_hdcp iTCO_vendor_support rapl btmtk joydev intel_rapl_msr snd_pcm processor_thermal_device_pci cfg80211 processor_thermal_device intel_cstate bluetooth snd_timer processor_thermal_wt_hint intel_uncore snd spi_intel_pci wmi_bmof i2c_i801 mei_me processor_thermal_rfim pcspkr i2c_smbus soundcore spi_intel idma64 processor_thermal_rapl mei mxc4005 rtsx_usb_ms intel_ipu6 rfkill intel_rapl_common industrialio_triggered_buffer processor_thermal_wt_req ipu_bridge memstick kfifo_buf igen6_edac processor_thermal_power_floor processor_thermal_mbox industrialio goodix_ts int3403_thermal intel_skl_int3472_tps68470 soc_button_array int340x_thermal_zone ov2740 v4l2_fwnode intel_pmc_core tps68470_regulator v4l2_async clk_tps68470 intel_hid intel_vsec int3400_thermal sparse_keymap dptf_power pmt_telemetry acpi_thermal_rel
Dez 13 01:42:14 fedora kernel: intel_skl_int3472_discrete pmt_class acpi_tad acpi_pad v4l2loopback(OE) videodev mc loop nfnetlink zram dm_crypt xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec mmc_block rtsx_usb_sdmmc mmc_core rtsx_usb i915 crct10dif_pclmul crc32_pclmul crc32c_intel i2c_algo_bit polyval_clmulni drm_buddy polyval_generic ttm nvme ghash_clmulni_intel drm_display_helper sha512_ssse3 nvme_core sha256_ssse3 sha1_ssse3 cec nvme_auth video wmi pinctrl_tigerlake serio_raw i2c_dev fuse
Dez 13 01:42:14 fedora kernel: CPU: 8 UID: 0 PID: 20 Comm: rcu_exp_gp_kthr Tainted: G D W OEL 6.11.11-300.fc41.x86_64 #1
Dez 13 01:42:14 fedora kernel: Tainted: [D]=DIE, [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE, [L]=SOFTLOCKUP
Dez 13 01:42:14 fedora kernel: Hardware name: Wortmann_AG 1220142;1470536/S1203i512, BIOS WHJ-BI-123-SF133ALR110-S8GB-328-G 10/31/2023
Dez 13 01:42:14 fedora kernel: RIP: 0010:smp_call_function_single+0xe9/0x140
Dez 13 01:42:16 fedora systemd[2110]: org.gnome.Shell@wayland.service: State ’stop-watchdog‘ timed out. Killing.
Dez 13 01:42:16 fedora systemd[2110]: org.gnome.Shell@wayland.service: Killing process 2269 (gnome-shell) with signal SIGKILL.
Dez 13 01:42:16 fedora systemd[2110]: org.gnome.Shell@wayland.service: Killing process 2291 (pool-spawner) with signal SIGKILL.
Dez 13 01:42:16 fedora systemd[2110]: org.gnome.Shell@wayland.service: Killing process 2292 (gmain) with signal SIGKILL.
Dez 13 01:42:16 fedora systemd[2110]: org.gnome.Shell@wayland.service: Killing process 2294 (gdbus) with signal SIGKILL.
Dez 13 01:42:16 fedora systemd[2110]: org.gnome.Shell@wayland.service: Killing process 2295 (dconf worker) with signal SIGKILL.

Fedora Kernel 6.11.11 crasht auf einigen Geräten beim Booten

Zum Glück für alle Linuxuser gibts es mehr als einen Kernel auf so einem System, daher bekommt man derartige Probleme leicht wieder in den Griff. Da ein Boot mit einem alten Kernel ( einfachste Option das zu lösen ) Fedora, den Kernel und die neue ov2740 Version nicht weiterbringen, habe ich auf anraten Kernel 6.13.0 ausprobiert. OP SUCCESS \o/

Der Kernel bootet fehlerfrei, nur leider immer noch den ungefixten ov2740 Kameratreiber 🙁

Zu dem Schlamassel gibt es dann auch einen Eintrag von Hans De Goede: https://hansdegoede.dreamwidth.org/29039.html

Alle Kernel 6.11.11 – 6.12.4 sind betroffen, 6.12.5 soll das beheben. Also macht einfach solange mit dem 6.11.10 Kernel weiter, bis 6.12.5 oder gleich 6.13 kommt, je nach dem 😉