Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2022-0185 — CVE-2022-0185 POC und Docker und Analyse Write-up | Kitploit
Tools/GitHubGitHub/chenaotian/cve-2022-0185
Privilege EscalationSchwachstellenanalyseExploitationLernen & BildungContainer-AusbruchBinary-ExploitationLabs & Praxis
GitHubchenaotian/cve-2022-0185

CVE-2022-0185

CVE-2022-0185 POC und Docker und Analyse Write-up

Repository anzeigen
371218vor 4 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2022-0185 Linux-Kernel-Privilegieneskalation (Escape)

[toc]

Schwachstellenübersicht

Schwachstellen-ID: CVE-2022-0185

Schwachstellenbewertung:

Betroffenes Produkt: linux kernel - fsconfig syscall

Betroffene Versionen: linux kernel 5.1-rc1 ~ 5.16.2

Ausnutzungsbedingungen: Linux lokal; Besitz der CAP_SYS_ADMIN-Capability (kann direkt mit unshare erlangt werden, daher praktisch uneingeschränkt)

Auswirkung: Lokale Privilegieneskalation; Container-Escape

Quellcode beziehen: git clone git://kernel.ubuntu.com/ubuntu/ubuntu-focal.git -b Ubuntu-hwe-5.11-5.11.0-27.29_20.04.1 --depth 1

oder https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/

Umgebungseinrichtung

Debugging-Umgebung

Docker für die Kompilierung von 5.X-Kerneln: chenaotian/kernelcompile

Docker für die Schwachstellenanalyse: chenaotian/cve-2022-0185

  • Vorbereitet wurden zwei Kernel: einer aus einer Distribution und einer selbst kompiliert.

    • Ein heruntergeladener Distributionskernel 5.11.0-44 zur Verifikation und zum Debuggen des Exploits (Distributionskernel stürzt nicht ab).
    • Ein kompilierter, symbolhaltiger Kernel 5.13 für das Debugging des PoC mit Symbolen.
  • Installation von qemu, gdb, gdb-peda usw.

  • Die Schwachstellen-bezogenen Dateien befinden sich in /root/cve-2022-0185.

    • boot_exp.sh zum Starten des Exploits in der Debugging-Umgebung (Distributionskernel 5.11.0-44, kein Symbol).
    • boot_poc.sh zum Starten des PoC in der Testumgebung, kann den Kernel zum Absturz bringen, aber Exploit läuft nicht; selbst kompilierter Kernel 5.13 mit Symbolen.
    • Verzeichnis exp: exp Quellcode (Autor: BitsByWill), exploit_fuse direkt kompilieren.

QEMU-Umgebung: https://github.com/chenaotian/CVE-2022-0185/tree/main/qemuANDexp

Ubuntu 20.04 Testumgebung

Ubuntu 20.04 VM-Umgebung zum Ausführen des Exploits, basierend auf dem Original-exp

Bereiten Sie eine Ubuntu 20.04 VM vor und tauschen Sie dann den Kernel aus:```shell apt-get install linux-image-5.11.0-44-generic

grep menuentry /boot/grub/grub.cfg vim /etc/default/grub #修改 GRUB_DEFAULT 选项为上面结果中想要启动内核的下标 update-grub #如果不生效的话则直接进入/boot 目录将之前的内核相关文件(带之前内核编号的文件)全部删掉,然后启动时候报找不到内核,然后手动选择内核启动也可以

#编译exp make fuse ./exploit

提权效果

![image-20220302154151113](https://assets.kitploit.com/production/public/readmes/23851/8a05fdeba02fe0085dd469683ac49ca6e97ab8f291d904ed417ac022fe68ac76.png)

## Schwachstellenprinzip

Die Schwachstelle tritt beim Systemaufruf `fsconfig` in der Option `FSCONFIG_SET_STRING` auf. Dieser Systemaufruf dient zur Konfiguration eines bereits geöffneten Dateisystemkontexts. **Voraussetzung ist die Capability `CAP_SYS_ADMIN`**:

> Der Hauptzweck von `fsopen` ist es, einen Dateisystemkontext zu erstellen und ihn mit einem Dateideskriptor zu verknüpfen, dann den Dateideskriptor zurückzugeben. Nach `fsopen` kommt `fsconfig`. Wie man dem Namen entnehmen kann, haben wir über `fsopen` einen Dateisystemkontext erstellt. Das folgende `fsconfig` dient wahrscheinlich dazu, den Inhalt des Dateisystemkontexts zu konfigurieren. Tatsächlich dient `fsconfig` hauptsächlich dieser Konfigurationsarbeit, unterstützt aber neben dem Dateisystemkontext auch andere Aufgaben.

### Schwachstellenort

Zunächst tritt die Schwachstelle in der Funktion `legacy_parse_param` auf:

linux-5.11\fs\fs_context.c : 502 : legacy_parse_param```c
static int legacy_parse_param(struct fs_context *fc, struct fs_parameter *param)
{
	struct legacy_fs_context *ctx = fc->fs_private;
	unsigned int size = ctx->data_size;
	size_t len = 0;

	··· ···
	··· ···

	switch (param->type) {
	case fs_value_is_string:
		len = 1 + param->size;
		fallthrough;
	··· ···
	}

	if (len > PAGE_SIZE - 2 - size) //此处边界检查有问题
		return invalf(fc, "VFS: Legacy: Cumulative options too large");
	if (strchr(param->key, ',') ||
	    (param->type == fs_value_is_string &&
	     memchr(param->string, ',', param->size)))
		return invalf(fc, "VFS: Legacy: Option '%s' contained comma",
			      param->key);
	if (!ctx->legacy_data) {
		ctx->legacy_data = kmalloc(PAGE_SIZE, GFP_KERNEL); //在第一次时会分配一页大小
		if (!ctx->legacy_data)
			return -ENOMEM;
	}

	ctx->legacy_data[size++] = ',';
	len = strlen(param->key);
	memcpy(ctx->legacy_data + size, param->key, len);
	size += len;
	if (param->type == fs_value_is_string) {
		ctx->legacy_data[size++] = '=';
		memcpy(ctx->legacy_data + size, param->string, param->size); //拷贝,可能越界
		size += param->size;
	}
	ctx->legacy_data[size] = '\0';
	ctx->data_size = size;
	ctx->param_type = LEGACY_FS_INDIVIDUAL_PARAMS;
	return 0;
}

Der Schlüssel liegt in der nachfolgenden memcpy, die unser übergebenes param->string in ctx->legacy_data kopiert. Die Prüfung, ob ein Kopierüberlauf vorliegt, erfolgt in der vorherigen Prüfung (len > PAGE_SIZE - 2 - size). Diese Prüfung ist fehlerhaft, da der Prüftyp size_t ist, also unsigned int. Wenn size > PAGE_SIZE - 2 ist, kommt es zu einem Integer-Überlauf-Umkehr, was dazu führt, dass len < PAGE_SIZE - 2 - size wird. Dadurch wird die Prüfung bestanden, und beim späteren Kopieren ist size größer als PAGE_SIZE - 2, was einen Kopierüberlauf verursacht.

Einige verwendete Datenstrukturen:```c struct fs_context { const struct fs_context_operations ops; struct mutex uapi_mutex; / Userspace access mutex */ struct file_system_type *fs_type; void fs_private; / The filesystem's context */ void *sget_key; struct dentry root; / The root and superblock */ struct user_namespace user_ns; / The user namespace for this mount */ struct net net_ns; / The network namespace for this mount */ const struct cred cred; / The mounter's credentials / struct p_log log; / Logging buffer */ const char source; / The source name (eg. dev path) */ void security; / Linux S&M options / void s_fs_info; / Proposed s_fs_info / unsigned int sb_flags; / Proposed superblock flags (SB_) / unsigned int sb_flags_mask; / Superblock flags that were changed / unsigned int s_iflags; / OR'd with sb->s_iflags / unsigned int lsm_flags; / Information flags from the fs to the LSM / enum fs_context_purpose purpose:8; enum fs_context_phase phase:8; / The phase the context is in / bool need_free:1; / Need to call ops->free() / bool global:1; / Goes into &init_user_ns / bool oldapi:1; / Coming from mount(2) */ };

struct legacy_fs_context { char legacy_data; / Data page for legacy filesystems */ size_t data_size; enum legacy_fs_param param_type; };

struct fs_parameter { const char key; / Parameter name / enum fs_value_type type:8; / The type of value here */ union { char *string; void *blob; struct filename *name; struct file *file; }; size_t size; int dirfd; };

### Aufrufpfad

Im Folgenden wird der Funktionsaufruf-Stack analysiert. Zunächst ist der Einstiegspunkt definitiv der Systemaufruf `fsconfig`:

linux-5.11\fs\fsopen.c : 314 : SYSCALL_DEFINE5(fsconfig,...```c
SYSCALL_DEFINE5(fsconfig,
		int, fd,
		unsigned int, cmd,
		const char __user *, _key,
		const void __user *, _value,
		int, aux)
{
	struct fs_context *fc;
	struct fd f;
	int ret;
	int lookup_flags = 0;

	struct fs_parameter param = {
		.type	= fs_value_is_undefined,
	};

	··· ···
	f = fdget(fd);
	if (!f.file)
		return -EBADF;
	ret = -EINVAL;
	if (f.file->f_op != &fscontext_fops)
		goto out_f;

	fc = f.file->private_data; //设置fc
    
	··· ···
	switch (cmd) {
	··· ···
	case FSCONFIG_SET_STRING:
		param.type = fs_value_is_string;
        //初始化结构体中的联合体中的string成员为用户传入的字符串
		param.string = strndup_user(_value, 256); 
		if (IS_ERR(param.string)) {
			ret = PTR_ERR(param.string);
			goto out_key;
		}
		param.size = strlen(param.string);//设置size
		break;
	··· ···
    ··· ···
	}
Tool herunterladen