Како Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΈ СкстСнзии Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° macOS

Π—Π΄Ρ€Π°Π²ΠΎ, Π₯Π°Π±Ρ€! ДСнСс Π±ΠΈ сакал Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΎΠ΄ Π½Π°ΠΏΠ°Π΄ΠΈ ΠΎΠ΄ Π½Π°ΠΏΠ°Ρ“Π°Ρ‡ΠΈ Π²ΠΎ macOS. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ²Π° Π΅ корисно Π·Π° антивирус ΠΈΠ»ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²Π΅Π½ систСм, особСно Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ΠΏΠΎΠ΄ macOS ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π΄Π° сС β€žΡƒΠ±ΠΈΠ΅β€œ процСс. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ Π·Π° ΠΎΠ²Π° ΠΈ Π·Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΏΠΎΠ΄ ΡΠ΅Ρ‡Π΅ΡšΠ΅Ρ‚ΠΎ.

Како Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΈ СкстСнзии Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° macOS

ΠšΠ»Π°ΡΠΈΡ‡Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС β€žΡƒΠ±ΠΈΠ΅β€œ процСс

Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠ·Π½Π°Ρ‚ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС β€žΡƒΠ±ΠΈΠ΅β€œ процСс Π΅ Π΄Π° сС испрати сигнал SIGKILL Π΄ΠΎ процСсот. ΠŸΡ€Π΅ΠΊΡƒ баш, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ°Ρ‚Π΅ стандарднитС β€žkill -SIGKILL PIDβ€œ ΠΈΠ»ΠΈ β€žpkill -9 NAMEβ€œ Π·Π° убиство. ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° β€žΡƒΠ±ΠΈΡ˜β€œ Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚Π° ΡƒΡˆΡ‚Π΅ ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° UNIX ΠΈ Π΅ достапна Π½Π΅ само Π½Π° macOS, Ρ‚ΡƒΠΊΡƒ ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ систСми слични Π½Π° UNIX.

Π˜ΡΡ‚ΠΎ ΠΊΠ°ΠΊΠΎ ΠΈ Π²ΠΎ систСмитС слични Π½Π° UNIX, macOS Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° прСсрСтнСтС ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ сигнали Π΄ΠΎ процСс освСн Π΄Π²Π° - SIGKILL ΠΈ SIGSTOP. Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° првСнствСно ќС сС фокусира Π½Π° сигналот SIGKILL ΠΊΠ°ΠΊΠΎ сигнал ΡˆΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΡƒΠ²Π° ΡƒΠ½ΠΈΡˆΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° процСс.

спСцифики Π½Π° macOS

На macOS, ΠΏΠΎΠ²ΠΈΠΊΠΎΡ‚ Π½Π° систСмот Π·Π° ΡƒΠ±ΠΈΠ²Π°ΡšΠ΅ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ XNU ја ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° psignal(SIGKILL,...). АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠΎΠΈ Π΄Ρ€ΡƒΠ³ΠΈ кориснички Π΄Π΅Ρ˜ΡΡ‚Π²Π° Π²ΠΎ корисничкиот простор ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π°Ρ‚ со Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° psignal. АјдС Π΄Π° Π³ΠΈ отстранимС ΠΏΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ Π΄ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° psignal Π²ΠΎ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ (ΠΈΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Π±ΠΈ сС Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΡ˜Π°Π»Π½ΠΈ, ќС Π³ΠΈ оставимС Π·Π° Π΄Ρ€ΡƒΠ³Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° πŸ™‚ - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° потпис, Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π°, Ρ€Π°ΠΊΡƒΠ²Π°ΡšΠ΅ со ΠΈΠ·Π»Π΅Π·/ΠΊΡ€Π°Ρ˜, ΠΏΡ€Π΅ΠΊΡ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π°Ρ‚Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΈΡ‚Π½. .

Π”Π° Π³ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π³Π»Π΅Π΄ΠΎΡ‚ со Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ соодвСтниот систСмски ΠΏΠΎΠ²ΠΈΠΊ ΠΏΡ€Π΅ΠΊΠΈΠ½ΠΈ_со_плаќањС. Π‘Π΅ Π³Π»Π΅Π΄Π° Π΄Π΅ΠΊΠ° ΠΏΠΎΠΊΡ€Π°Ρ˜ класичниот ΠΏΠΎΠ²ΠΈΠΊ Π·Π° ΡƒΠ±ΠΈΠ²Π°ΡšΠ΅, постои ΠΈ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π΅Π½ пристап кој Π΅ спСцифичСн Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм macOS ΠΈ Π³ΠΎ Π½Π΅ΠΌΠ° Π²ΠΎ BSD. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° Π΄Π²Π°Ρ‚Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ сС исто Ρ‚Π°ΠΊΠ° слични. Π’ΠΈΠ΅ сС Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π΄ΠΎ псигналот Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Π·Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° ΠΏΡ€Π΅Π΄ Π΄Π° сС ΡƒΠ±ΠΈΠ΅ процСс, сС Π²Ρ€ΡˆΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° β€žΠΊΠ°Π½ΡΠΈΠ³Π½Π°Π»β€œ - Π΄Π°Π»ΠΈ процСсот ΠΌΠΎΠΆΠ΅ Π΄Π° испрати сигнал Π΄ΠΎ Π΄Ρ€ΡƒΠ³ процСс; систСмот Π½Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° Π½ΠΈΡ‚Ρƒ Π΅Π΄Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π΄Π° Π³ΠΈ ΡƒΠ±ΠΈΠ΅ систСмскитС процСси, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

static int
terminate_with_payload_internal(struct proc *cur_proc, int target_pid, uint32_t reason_namespace,
				uint64_t reason_code, user_addr_t payload, uint32_t payload_size,
				user_addr_t reason_string, uint64_t reason_flags)
{
...
	target_proc = proc_find(target_pid);
...
	if (!cansignal(cur_proc, cur_cred, target_proc, SIGKILL)) {
		proc_rele(target_proc);
		return EPERM;
	}
...
	if (target_pid == cur_proc->p_pid) {
		/*
		 * psignal_thread_with_reason() will pend a SIGKILL on the specified thread or
		 * return if the thread and/or task are already terminating. Either way, the
		 * current thread won't return to userspace.
		 */
		psignal_thread_with_reason(target_proc, current_thread(), SIGKILL, signal_reason);
	} else {
		psignal_with_reason(target_proc, SIGKILL, signal_reason);
	}
...
}

лансиран

Π’ΠΎΠ²Π΅Π΄Π΅Π½ Π΅ стандардниот Π½Π°Ρ‡ΠΈΠ½ Π·Π° создавањС Π΄Π΅ΠΌΠΎΠ½ΠΈ ΠΏΡ€ΠΈ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° систСмот ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° Π½ΠΈΠ²Π½ΠΈΠΎΡ‚ ΠΆΠΈΠ²ΠΎΡ‚Π΅Π½ Π²Π΅ΠΊ. Π˜ΠΌΠ°Ρ˜Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅ сС Π·Π° старата Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° launchctl Π΄ΠΎ macOS 10.10, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΊΠΎΠ΄ сС Π΄Π°Π΄Π΅Π½ΠΈ Π·Π° илустративни Ρ†Π΅Π»ΠΈ. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½ΠΈΠΎΡ‚ launchctl ΠΈΡΠΏΡ€Π°ΡœΠ° лансирани сигнали ΠΏΡ€Π΅ΠΊΡƒ XPC, Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° launchctl Π΅ прСмСстСна Π²ΠΎ Π½Π΅Π³ΠΎ.

АјдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ сС стопираат Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅. ΠŸΡ€Π΅Π΄ Π΄Π° сС испрати сигналот SIGTERM, Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π° Π΄Π° сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅ со помош Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ β€žproc_terminateβ€œ.

<launchctl src/core.c>
...
	error = proc_terminate(j->p, &sig);
	if (error) {
		job_log(j, LOG_ERR | LOG_CONSOLE, "Could not terminate job: %d: %s", error, strerror(error));
		job_log(j, LOG_NOTICE | LOG_CONSOLE, "Using fallback option to terminate job...");
		error = kill2(j->p, SIGTERM);
		if (error) {
			job_log(j, LOG_ERR, "Could not signal job: %d: %s", error, strerror(error));
		} 
...
<>

Под Ρ…Π°ΡƒΠ±Π°Ρ‚Π°, proc_terminate, ΠΈ ΠΏΠΎΠΊΡ€Π°Ρ˜ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅, ΠΌΠΎΠΆΠ΅ Π΄Π° испрати Π½Π΅ само psignal со SIGTERM, Ρ‚ΡƒΠΊΡƒ ΠΈ SIGKILL.

Π˜Π½Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ убиство - ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° рСсурситС

ΠŸΠΎΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ΅Π½ ΡΠ»ΡƒΡ‡Π°Ρ˜ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π²ΠΎ Π΄Ρ€ΡƒΠ³ систСмски ΠΏΠΎΠ²ΠΈΠΊ процСс_ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°. Π’ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° овој систСмски ΠΏΠΎΠ²ΠΈΠΊ Π΅ Π΄Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Ρ‚ рСсурситС Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ индСксаторот Π΄Π° Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° процСсорот ΠΈ ΠΊΠ²ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π°, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ систСмот Π½Π΅ Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Π±Π°Π²Π΅Π½ ΠΎΠ΄ активноститС Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Ако Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π³ΠΎ достигнала ΡΠ²ΠΎΡ˜ΠΎΡ‚ Π»ΠΈΠΌΠΈΡ‚ Π½Π° рСсурси, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° proc_apply_resource_actions, сигналот SIGKILL сС ΠΈΡΠΏΡ€Π°ΡœΠ° Π΄ΠΎ процСсот.

Иако овој систСмски ΠΏΠΎΠ²ΠΈΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΡ˜Π°Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡƒΠ±ΠΈΠ΅ процСс, систСмот Π½Π΅ Π³ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ соодвСтно ΠΏΡ€Π°Π²Π°Ρ‚Π° Π½Π° процСсот ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ. Π’ΡΡƒΡˆΠ½ΠΎΡΡ‚ сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° постоСлС, Π½ΠΎ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° сС користи Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΡ‚ΠΎ Π·Π½Π°ΠΌΠ΅Π½Ρ†Π΅ PROC_POLICY_ACTION_SET Π·Π° Π΄Π° сС Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈ ΠΎΠ²Π°Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°.

ΠžΡ‚Ρ‚ΡƒΠΊΠ°, Π°ΠΊΠΎ ја β€žΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅β€œ ΠΊΠ²ΠΎΡ‚Π°Ρ‚Π° Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° процСсорот Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π°Ρ˜ΡœΠΈ само 1 ns Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ), Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΡƒΠ±ΠΈΠ΅Ρ‚Π΅ сСкој процСс Π²ΠΎ систСмот. Π’Π°ΠΊΠ°, ΠΌΠ°Π»ΠΈΡ†ΠΈΠΎΠ·Π½ΠΈΠΎΡ‚ софтвСр ΠΌΠΎΠΆΠ΅ Π΄Π° ΡƒΠ±ΠΈΠ΅ кој Π±ΠΈΠ»ΠΎ процСс Π½Π° систСмот, Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΈ антивирусниот процСс. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ΅Π½ Π΅ ΠΈ Π΅Ρ„Π΅ΠΊΡ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ сС Ρ˜Π°Π²ΡƒΠ²Π° ΠΏΡ€ΠΈ ΡƒΠ±ΠΈΠ²Π°ΡšΠ΅ Π½Π° процСс со pid 1 (launchctl) - ΠΏΠ°Π½ΠΈΠΊΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΠ³Π° сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ сигналот SIGKILL :)

Како Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΈ СкстСнзии Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° macOS

Како Π΄Π° сС Ρ€Π΅ΡˆΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚?

ΠΠ°Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΈΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС спрСчи ΡƒΠ½ΠΈΡˆΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° процСс Π΅ Π΄Π° сС Π·Π°ΠΌΠ΅Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° Π·Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ. Π—Π° ΠΆΠ°Π», овој ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΅ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΡ˜Π°Π»Π΅Π½ ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ.

ΠŸΡ€Π²ΠΎ, симболот ΡˆΡ‚ΠΎ ја ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° мСмориската Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° sysent Π½Π΅ Π΅ само ΠΏΡ€ΠΈΠ²Π°Ρ‚Π΅Π½ Π·Π° симболот Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ XNU, Ρ‚ΡƒΠΊΡƒ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС најдС Π²ΠΎ симболитС Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. ЌС ΠΌΠΎΡ€Π° Π΄Π° користитС хСуристички ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡ΠΊΠΎ Ρ€Π°ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ Π²ΠΎ Π½Π΅Π°.

Π’Ρ‚ΠΎΡ€ΠΎ, структурата Π½Π° записитС Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° зависи ΠΎΠ΄ Π·Π½Π°ΠΌΠ΅Π½Ρ†Π°Ρ‚Π° со ΠΊΠΎΠΈ Π΅ составСно ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚. Ако сС Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π° Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ CONFIG_REQUIRES_U32_MUNGING, Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° структурата ќС сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ - ќС сС Π΄ΠΎΠ΄Π°Π΄Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅ sy_arg_munge32. НСопходно Π΅ Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π° Π΄Π° сС ΡƒΡ‚Π²Ρ€Π΄ΠΈ со ΠΊΠΎΠ΅ Π·Π½Π°ΠΌΠ΅Π½Ρ†Π΅ Π΅ составСно ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚, ΠΈΠ»ΠΈ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π΄Π° сС ΠΏΡ€ΠΎΠ²Π΅Ρ€Π°Ρ‚ функцискитС ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΡ‚Π΅.

struct sysent {         /* system call table */
        sy_call_t       *sy_call;       /* implementing function */
#if CONFIG_REQUIRES_U32_MUNGING || (__arm__ && (__BIGGEST_ALIGNMENT__ > 4))
        sy_munge_t      *sy_arg_munge32; /* system call arguments munger for 32-bit process */
#endif
        int32_t         sy_return_type; /* system call return types */
        int16_t         sy_narg;        /* number of args */
        uint16_t        sy_arg_bytes;   /* Total size of arguments in bytes for
                                         * 32-bit system calls
                                         */
};

Π—Π° ΡΡ€Π΅ΡœΠ°, Π²ΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΠΈ Π½Π° macOS, Apple ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° Π½ΠΎΠ²ΠΎ API Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со процСси. Endpoint Security API ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π΄Π° овластат ΠΌΠ½ΠΎΠ³Ρƒ Π±Π°Ρ€Π°ΡšΠ° Π·Π° Π΄Ρ€ΡƒΠ³ΠΈ процСси. Π’Π°ΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ сигнали Π΄ΠΎ процСситС, Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΈ сигналот SIGKILL, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ горСспомСнатиот API.

#include <bsm/libbsm.h>
#include <EndpointSecurity/EndpointSecurity.h>
#include <unistd.h>

int main(int argc, const char * argv[]) {
    es_client_t* cli = nullptr;
    {
        auto res = es_new_client(&cli, ^(es_client_t * client, const es_message_t * message) {
            switch (message->event_type) {
                case ES_EVENT_TYPE_AUTH_SIGNAL:
                {
                    auto& msg = message->event.signal;
                    auto target = msg.target;
                    auto& token = target->audit_token;
                    auto pid = audit_token_to_pid(token);
                    printf("signal '%d' sent to pid '%d'n", msg.sig, pid);
                    es_respond_auth_result(client, message, pid == getpid() ? ES_AUTH_RESULT_DENY : ES_AUTH_RESULT_ALLOW, false);
                }
                    break;
                default:
                    break;
            }
        });
    }

    {
        es_event_type_t evs[] = { ES_EVENT_TYPE_AUTH_SIGNAL };
        es_subscribe(cli, evs, sizeof(evs) / sizeof(*evs));
    }

    printf("%dn", getpid());
    sleep(60); // could be replaced with other waiting primitive

    es_unsubscribe_all(cli);
    es_delete_client(cli);

    return 0;
}

Π‘Π»ΠΈΡ‡Π½ΠΎ, Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС рСгистрира ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π½Π° MAC, која ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π° Π½Π° сигналот (ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° proc_check_signal), Π½ΠΎ API-Ρ‚ΠΎ Π½Π΅ Π΅ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½ΠΎ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΎ.

Π—Π°ΡˆΡ‚ΠΈΡ‚Π° Π·Π° ΠΏΡ€ΠΎΡˆΠΈΡ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ

ΠŸΠΎΠΊΡ€Π°Ρ˜ Π·Π°ΡˆΡ‚ΠΈΡ‚Π°Ρ‚Π° Π½Π° процСситС Π²ΠΎ систСмот, Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½Π° Π΅ ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚Π° Π½Π° самата Π΅ΠΊΡΡ‚Π΅Π½Π·ΠΈΡ˜Π° Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ (kext). macOS ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° Ρ€Π°ΠΌΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ лСсно Π΄Π° Π³ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Π°Ρ‚ Π΄Ρ€Π°Ρ˜Π²Π΅Ρ€ΠΈΡ‚Π΅ Π·Π° ΡƒΡ€Π΅Π΄ΠΈΡ‚Π΅ IOKit. ΠŸΠΎΠΊΡ€Π°Ρ˜ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со ΡƒΡ€Π΅Π΄ΠΈ, IOKit ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄Ρ€Π°Ρ˜Π²Π΅Ρ€ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ ΠΎΠ΄ класитС C++. ΠΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ корисничкиот простор ќС ΠΌΠΎΠΆΠ΅ Π΄Π° β€žΠΏΡ€ΠΎΠ½Π°Ρ˜Π΄Π΅β€œ рСгистриран ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ класата Π·Π° Π΄Π° воспостави врска ΠΊΠ΅Ρ€Π½Π΅Π»-кориснички простор.

Π—Π° Π΄Π° сС ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ Π½Π° класи Π²ΠΎ систСмот, постои Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° ioclasscount.

my_kext_ioservice = 1
my_kext_iouserclient = 1

БСкоја Π΅ΠΊΡΡ‚Π΅Π½Π·ΠΈΡ˜Π° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΡˆΡ‚ΠΎ сака Π΄Π° сС рСгистрира со стСкот Π½Π° Π΄Ρ€Π°Ρ˜Π²Π΅Ρ€ΠΈ ΠΌΠΎΡ€Π° Π΄Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π° класа ΡˆΡ‚ΠΎ наслСдува ΠΎΠ΄ IOService, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ my_kext_ioservice Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜. ΠŸΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° корисничкитС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΡƒΠ²Π° создавањС Π½Π° Π½ΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ класата ΡˆΡ‚ΠΎ наслСдува ΠΎΠ΄ IOUserClient, Π²ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ my_kext_iouserclient.

Кога сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°Ρ‚Π΅ Π΄Π° растоваратС Π΄Ρ€Π°Ρ˜Π²Π΅Ρ€ ΠΎΠ΄ систСмот (ΠΊΠΎΠΌΠ°Π½Π΄Π° kextunload), сС ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° β€žbool terminate(IOOptionBits options)β€œ. Π”ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈ false Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠΎΡ‚ Π·Π° Π΄Π° сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅ ΠΊΠΎΠ³Π° сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°Ρ‚Π΅ Π΄Π° сС истоваритС Π·Π° Π΄Π° сС ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠΈ kextunload.

bool Kext::terminate(IOOptionBits options)
{

  if (!IsUnloadAllowed)
  {
    // Unload is not allowed, returning false
    return false;
  }

  return super::terminate(options);
}

Π—Π½Π°ΠΌΠ΅Ρ‚ΠΎ IsUnloadAllowed ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ постави IOUserClient ΠΏΡ€ΠΈ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΡšΠ΅. Кога ΠΈΠΌΠ° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ΅ Π·Π° ΠΏΡ€Π΅Π·Π΅ΠΌΠ°ΡšΠ΅, ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° kextunload ќС Π³ΠΎ Π²Ρ€Π°Ρ‚ΠΈ слСдниов ΠΈΠ·Π»Π΅Π·:

admin@admins-Mac drivermanager % sudo kextunload ./test.kext
Password:
(kernel) Can't remove kext my.kext.test; services failed to terminate - 0xe00002c7.
Failed to unload my.kext.test - (iokit/common) unsupported function.

Π‘Π»ΠΈΡ‡Π½Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π° ΠΌΠΎΡ€Π° Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π·Π° IOUserClient. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈΡ‚Π΅ Π½Π° класитС ΠΌΠΎΠΆΠ΅ Π΄Π° сС растоварат со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° кориснички простор Π½Π° IOKitLib β€žIOCatalogueTerminate(mach_port_t, uint32_t Π·Π½Π°ΠΌΠ΅Π½Ρ†Π΅, io_name_t опис); ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠΎΠ³Π° ја ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° β€žterminateβ€œ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° кориснички простор Π½Π΅ β€žΡƒΠΌΡ€Π΅β€œ, односно Π½Π΅ сС ΠΏΠΎΠ²ΠΈΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° β€žclientDiedβ€œ.

Π—Π°ΡˆΡ‚ΠΈΡ‚Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ

Π—Π° Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅, Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° користитС Kauth API, кој Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅ пристапот Π΄ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅. Apple ΠΈΠΌ Π΄Π°Π²Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ·Π²Π΅ΡΡ‚ΡƒΠ²Π°ΡšΠ° Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ настани Π²ΠΎ опсСгот; Π·Π° нас, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA ΠΈ KAUTH_VNODE_DELETE_CHILD сС Π²Π°ΠΆΠ½ΠΈ. НајлСсСн Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ пристапот Π΄ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Π΅ ΠΏΠΎ ΠΏΠ°Ρ‚Π΅ΠΊΠ° - Π³ΠΎ користимС API β€žvn_getpathβ€œ Π·Π° Π΄Π° ја Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π΄ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΈ Π΄Π° Π³ΠΎ спорСдимС прСфиксот Π½Π° ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π°. Π—Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° Π·Π° Π΄Π° сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°Ρ‚Π΅ΠΊΠΈΡ‚Π΅ Π½Π° ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° со Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, систСмот Π½Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° пристап Π΄ΠΎ сСкоја Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, Ρ‚ΡƒΠΊΡƒ само Π΄ΠΎ самата ΠΏΠ°ΠΏΠΊΠ° ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π°. НСопходно Π΅ Π΄Π° сС спорСди ΠΌΠ°Ρ‚ΠΈΡ‡Π½Π°Ρ‚Π° ΠΏΠ°Ρ‚Π΅ΠΊΠ° ΠΈ Π΄Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ KAUTH_VNODE_DELETE Π·Π° Π½Π΅Π°.

Како Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΈ СкстСнзии Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° macOS

НСдостаток Π½Π° овој пристап ΠΌΠΎΠΆΠ΅ Π΄Π° сС нискитС пСрформанси бидСјќи Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° прСфикси сС Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π°. Π—Π° Π΄Π° сС осигуратС Π΄Π΅ΠΊΠ° спорСдбата Π½Π΅ Π΅ Π΅Π΄Π½Π°ΠΊΠ²Π° Π½Π° O (прСфикс*Π΄ΠΎΠ»ΠΆΠΈΠ½Π°), ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ прСфиксот Π΅ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° прСфикси, Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π΅ Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π½ΠΈΠ·Π°Ρ‚Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° користитС дСтСрминистички ΠΊΠΎΠ½Π΅Ρ‡Π΅Π½ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ (DFA) ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ со прСфикси.

АјдС Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€Π°ΡšΠ΅ Π½Π° DFA Π·Π° Π΄Π°Π΄Π΅Π½ сСт Π½Π° прСфикси. НиС Π³ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ курсоритС Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° сСкој прСфикс. Ако ситС курсори ΡƒΠΊΠ°ΠΆΡƒΠ²Π°Π°Ρ‚ Π½Π° истиот Π·Π½Π°ΠΊ, Ρ‚ΠΎΠ³Π°Ρˆ Π·Π³ΠΎΠ»Π΅ΠΌΠ΅Ρ‚Π΅ Π³ΠΎ сСкој курсор Π·Π° Π΅Π΄Π΅Π½ Π·Π½Π°ΠΊ ΠΈ Π·Π°ΠΏΠΎΠΌΠ½Π΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° истата линија Π΅ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° Π·Π° Π΅Π΄Π΅Π½. Ако ΠΈΠΌΠ° Π΄Π²Π° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΈ со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ симболи, ΠΏΠΎΠ΄Π΅Π»Π΅Ρ‚Π΅ Π³ΠΈ курсоритС Π²ΠΎ Π³Ρ€ΡƒΠΏΠΈ спорСд симболот ΠΊΠΎΠ½ кој ΡƒΠΊΠ°ΠΆΡƒΠ²Π°Π°Ρ‚ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Ρ‚Π΅ Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΡ‚ Π·Π° сСкоја Π³Ρ€ΡƒΠΏΠ°.

Π’ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜ (ситС Π·Π½Π°Ρ†ΠΈ ΠΏΠΎΠ΄ курсоритС сС исти), Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π½Π° DFA која ΠΈΠΌΠ° само Π΅Π΄Π½Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΡ˜Π° ΠΏΠΎ истата линија. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜, Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ Ρ‚Π°Π±Π΅Π»Π° со Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΠΈ со Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° 256 (Π±Ρ€ΠΎΡ˜ Π½Π° Π·Π½Π°Ρ†ΠΈ ΠΈ максималСн Π±Ρ€ΠΎΡ˜ Π½Π° Π³Ρ€ΡƒΠΏΠΈ) Π΄ΠΎ слСднитС ΡΠΎΡΡ‚ΠΎΡ˜Π±ΠΈ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈ со Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π°.

АјдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π—Π° Π·Π±ΠΈΡ€ Π½Π° прСфикси (β€œ/foo/bar/tmp/”, β€œ/var/db/foo/”, β€œ/foo/bar/aba/”, β€œfoo/bar/aac/”) ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ слСдново DFA. Π‘Π»ΠΈΠΊΠ°Ρ‚Π° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° само Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΠΈ ΠΊΠΎΠΈ Π²ΠΎΠ΄Π°Ρ‚ ΠΊΠΎΠ½ Π΄Ρ€ΡƒΠ³ΠΈ ΡΠΎΡΡ‚ΠΎΡ˜Π±ΠΈ; Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΈ.

Како Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΈ СкстСнзии Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° macOS

Кога ΠΏΠΎΠΌΠΈΠ½ΡƒΠ²Π°Ρ‚Π΅ Π½ΠΈΠ· Π΄Ρ€ΠΆΠ°Π²ΠΈΡ‚Π΅ DKA, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° 3 случаи.

  1. ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π΅ постигната - ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π΅ Π·Π°ΡˆΡ‚ΠΈΡ‚Π΅Π½Π°, Π³ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ KAUTH_VNODE_DELETE, KAUTH_VNODE_WRITE_DATA ΠΈ KAUTH_VNODE_DELETE_CHILD
  2. ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π½Π΅ бСшС постигната, Π½ΠΎ ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° β€žΠ·Π°Π²Ρ€ΡˆΠΈβ€œ (достигнат Π΅ Π½ΡƒΠ»Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€) - ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π», Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΎ Π΅ Π΄Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ KAUTH_VNODE_DELETE. Π—Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° Π°ΠΊΠΎ vnode Π΅ ΠΏΠ°ΠΏΠΊΠ°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ '/' Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚, Π²ΠΎ спротивно ΠΌΠΎΠΆΠ΅ Π΄Π° ја ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° β€ž/foor/bar/tβ€œ, ΡˆΡ‚ΠΎ Π΅ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎ.
  3. ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π½Π΅ бСшС постигната, ΠΏΠ°Ρ‚ΠΎΡ‚ Π½Π΅ Π·Π°Π²Ρ€ΡˆΠΈ. Ниту Π΅Π΄Π΅Π½ ΠΎΠ΄ прСфикситС Π½Π΅ сС совпаѓа со овој, Π½Π΅ Π²ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°.

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

Π¦Π΅Π»Ρ‚Π° Π½Π° бСзбСдноснитС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ˜Π° ΡˆΡ‚ΠΎ сС Ρ€Π°Π·Π²ΠΈΠ²Π°Π°Ρ‚ Π΅ Π΄Π° сС Π·Π³ΠΎΠ»Π΅ΠΌΠΈ Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° бСзбСдност Π½Π° корисникот ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Од Π΅Π΄Π½Π° страна, ΠΎΠ²Π°Π° Ρ†Π΅Π» сС постигнува со Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° софтвСрскиот ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ Acronis, кој Π³ΠΈ Π·Π°Ρ‚Π²ΠΎΡ€Π° ΠΎΠ½ΠΈΠ΅ пропусти ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ самиот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ систСм Π΅ β€žΡΠ»Π°Π±β€œ. Од Π΄Ρ€ΡƒΠ³Π° страна, Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π·Π°Π½Π΅ΠΌΠ°Ρ€ΠΈΠΌΠ΅ Π·Π°Ρ˜Π°ΠΊΠ½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ½ΠΈΠ΅ бСзбСдносни аспСкти ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ Π½Π° страната Π½Π° ОБ, особСно Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π·Π°Ρ‚Π²ΠΎΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ пропусти ја Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π° Π½Π°ΡˆΠ°Ρ‚Π° сопствСна стабилност ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄. Ранливоста бСшС ΠΏΡ€ΠΈΡ˜Π°Π²Π΅Π½Π° Π΄ΠΎ Ρ‚ΠΈΠΌΠΎΡ‚ Π·Π° бСзбСдност Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ Π½Π° Apple ΠΈ Π΅ ΠΏΠΎΠΏΡ€Π°Π²Π΅Π½Π° Π²ΠΎ macOS 10.14.5 (https://support.apple.com/en-gb/HT210119).

Како Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ процСситС ΠΈ СкстСнзии Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° macOS

Π‘Π΅Ρ‚ΠΎ ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ само Π°ΠΊΠΎ Π²Π°ΡˆΠ°Ρ‚Π° Π°Π»Π°Ρ‚ΠΊΠ° Π΅ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½ΠΎ инсталирана Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚. Односно, Π½Π΅ΠΌΠ° Ρ‚Π°ΠΊΠ²ΠΈ Π΄ΡƒΠΏΠΊΠΈ Π·Π° Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ΅Π½ ΠΈ нСсакан софтвСр. Π‘Π΅ΠΏΠ°ΠΊ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π΄ΡƒΡ€ΠΈ ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚Π°Ρ‚Π° Π½Π° Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС антивирусни ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΈ систСми Π±Π°Ρ€Π° Ρ€Π°Π±ΠΎΡ‚Π°. Но, сСга Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ Π½Π° Acronis Π·Π° macOS ќС ΠΈΠΌΠ°Π°Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π° ΠΎΠ΄ истовар ΠΎΠ΄ систСмот.

Π˜Π·Π²ΠΎΡ€: www.habr.com