From nobody Mon Dec 13 01:01:01 2021 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 03DFC18D3B27; Mon, 13 Dec 2021 01:01:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JC39C0sW7z3nnc; Mon, 13 Dec 2021 01:01:02 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D7ECD341F; Mon, 13 Dec 2021 01:01:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 1BD1119l010311; Mon, 13 Dec 2021 01:01:01 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1BD111C0010310; Mon, 13 Dec 2021 01:01:01 GMT (envelope-from git) Date: Mon, 13 Dec 2021 01:01:01 GMT Message-Id: <202112130101.1BD111C0010310@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: ba839bc9d3ee - stable/13 - rtld: extract header validation into new helper check_elf_headers() List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: ba839bc9d3eef8d2f68f298c76842fb215cd8ed4 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1639357263; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=HdVa+kkOdkuPSlCHO1695XtM8cviJGuU4W5V7ogtgZE=; b=vPn/NKNrGnjm2lIF1O0s0AgxJuoDGai0m0+PGC+3TuCadWAUy/jjdYiPuKFTX/7+aA/OPq sWIYnqRFppg4s7s9nSPPAL/Jwc9NCAiQ47vGuJlp7DsETp69/f+fE8RvKncV42tzyAyqHp v9aaOKZ0uf5Yu2CjS+JAJHKGhQ0tnQQgRI9urYKUxEM1aBwckhhAqyp2r9RQqIrIGH2lnx Gz22RSAJF/dMX7BncJUiC9SxWNP5x/T1K1Q/kCttQ3a3KD/fpxLEESECYomKaRnTe/JWnk tEDQleLO0xSmomcb377wDNa61asBVW+IynVR3SHT81mQK3wThTPgxxaC0MuHpw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1639357263; a=rsa-sha256; cv=none; b=eF7uCLMJQX6b1DaH097onlJuJpyx7kKgVIo9OBjneA7NIX5nYILZm+owVosj7+vaQrZoM6 Rv7VNV1DCHkMWdlFApvHJ6gazDrb1ZX7Y+aAcwv5t7VrXMi+TfSACWUP+EuxHJctPtKXQ5 smV0OWMGOBpii2TNVcHPVwF7HqnRCsd364G6N7UNfH32WC6nxRxg70IB9WGOhUAaJn3UiF Te2JOus3JObv+c9kxfgzBza5AaImJ9vGCHvb+tdvgG/VfbupCme+0H1V27ZgwdKO21wa2F 2ABHYm1YJmWyjuVZjV+Yvc2dLp3Bdqxca/YOh/rKI9tTleiNWJvr1Jed1UGoBw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=ba839bc9d3eef8d2f68f298c76842fb215cd8ed4 commit ba839bc9d3eef8d2f68f298c76842fb215cd8ed4 Author: Konstantin Belousov AuthorDate: 2021-11-11 17:51:26 +0000 Commit: Konstantin Belousov CommitDate: 2021-12-13 00:58:22 +0000 rtld: extract header validation into new helper check_elf_headers() (cherry picked from commit 63fc4e820c86f5dedb80cc31b7918deb284b455e) --- libexec/rtld-elf/map_object.c | 60 ++++++++++++++++++++++++------------------- libexec/rtld-elf/rtld.h | 1 + 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c index b725fe93b8f6..2da323c115cc 100644 --- a/libexec/rtld-elf/map_object.c +++ b/libexec/rtld-elf/map_object.c @@ -345,6 +345,39 @@ error: return (NULL); } +bool +check_elf_headers(const Elf_Ehdr *hdr, const char *path) +{ + if (!IS_ELF(*hdr)) { + _rtld_error("%s: invalid file format", path); + return (false); + } + if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS || + hdr->e_ident[EI_DATA] != ELF_TARG_DATA) { + _rtld_error("%s: unsupported file layout", path); + return (false); + } + if (hdr->e_ident[EI_VERSION] != EV_CURRENT || + hdr->e_version != EV_CURRENT) { + _rtld_error("%s: unsupported file version", path); + return (false); + } + if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) { + _rtld_error("%s: unsupported file type", path); + return (false); + } + if (hdr->e_machine != ELF_TARG_MACH) { + _rtld_error("%s: unsupported machine", path); + return (false); + } + if (hdr->e_phentsize != sizeof(Elf_Phdr)) { + _rtld_error( + "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); + return (false); + } + return (true); +} + static Elf_Ehdr * get_elf_header(int fd, const char *path, const struct stat *sbp, Elf_Phdr **phdr_p) @@ -366,39 +399,14 @@ get_elf_header(int fd, const char *path, const struct stat *sbp, } /* Make sure the file is valid */ - if (!IS_ELF(*hdr)) { - _rtld_error("%s: invalid file format", path); + if (!check_elf_headers(hdr, path)) goto error; - } - if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS || - hdr->e_ident[EI_DATA] != ELF_TARG_DATA) { - _rtld_error("%s: unsupported file layout", path); - goto error; - } - if (hdr->e_ident[EI_VERSION] != EV_CURRENT || - hdr->e_version != EV_CURRENT) { - _rtld_error("%s: unsupported file version", path); - goto error; - } - if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) { - _rtld_error("%s: unsupported file type", path); - goto error; - } - if (hdr->e_machine != ELF_TARG_MACH) { - _rtld_error("%s: unsupported machine", path); - goto error; - } /* * We rely on the program header being in the first page. This is * not strictly required by the ABI specification, but it seems to * always true in practice. And, it simplifies things considerably. */ - if (hdr->e_phentsize != sizeof(Elf_Phdr)) { - _rtld_error( - "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); - goto error; - } if (phdr_in_zero_page(hdr)) { phdr = (Elf_Phdr *)((char *)hdr + hdr->e_phoff); } else { diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index b216e80115bc..48b3ad526828 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -405,6 +405,7 @@ void free_tls_offset(Obj_Entry *obj); const Ver_Entry *fetch_ventry(const Obj_Entry *obj, unsigned long); int convert_prot(int elfflags); void *_get_tp(void); /* libc implementation */ +bool check_elf_headers(const Elf_Ehdr *hdr, const char *path); /* * MD function declarations.