mirror of
https://git.yoctoproject.org/poky
synced 2026-02-20 08:29:42 +01:00
Compare commits
60 Commits
yocto-3.1.
...
dunfell-23
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a631bfc3a3 | ||
|
|
ee461b4235 | ||
|
|
68801aaf80 | ||
|
|
38f85fe6dd | ||
|
|
62034cd625 | ||
|
|
87a450e222 | ||
|
|
d58a0c3239 | ||
|
|
667eb766ab | ||
|
|
56c03791cd | ||
|
|
acd638685c | ||
|
|
a4f1c6baa3 | ||
|
|
799673e3f4 | ||
|
|
6fd646cdb1 | ||
|
|
538185bd1c | ||
|
|
6dd6670429 | ||
|
|
51a1d78e2a | ||
|
|
e610a24db7 | ||
|
|
afb4425be9 | ||
|
|
20c932eb01 | ||
|
|
e0d5b78c92 | ||
|
|
00af542d30 | ||
|
|
bcb3c107d3 | ||
|
|
a526ef88ee | ||
|
|
0c1e54eee1 | ||
|
|
fcb3d9a63e | ||
|
|
79b0cf9cfa | ||
|
|
d8057ae9aa | ||
|
|
5150ad7fcb | ||
|
|
8064d53745 | ||
|
|
8ed92cf2b3 | ||
|
|
ba7aa15473 | ||
|
|
a307ef21c1 | ||
|
|
006f140687 | ||
|
|
77e8b40bae | ||
|
|
3cf950b245 | ||
|
|
7e24067f78 | ||
|
|
0ce97636c9 | ||
|
|
90adc17feb | ||
|
|
2ace3a0b1e | ||
|
|
1f1d3d2647 | ||
|
|
07f99e3dea | ||
|
|
2b2f5660b9 | ||
|
|
8c4a94a6de | ||
|
|
fd5bb826ea | ||
|
|
342bf915dc | ||
|
|
72707c04e1 | ||
|
|
f76c7b8e63 | ||
|
|
1c69728f31 | ||
|
|
048d8b8c71 | ||
|
|
afaadab7e9 | ||
|
|
f160d63cb5 | ||
|
|
9cfc1a05ba | ||
|
|
1daa0b9922 | ||
|
|
97b1bdd293 | ||
|
|
be80f805d4 | ||
|
|
0f0b0b0a9b | ||
|
|
7b2e3ff618 | ||
|
|
1351d0261b | ||
|
|
e88f47da0e | ||
|
|
51a742eab1 |
@@ -1338,7 +1338,7 @@ class FetchCheckStatusTest(FetcherTest):
|
||||
"http://downloads.yoctoproject.org/releases/sato/sato-engine-0.2.tar.gz",
|
||||
"http://downloads.yoctoproject.org/releases/sato/sato-engine-0.3.tar.gz",
|
||||
"https://yoctoproject.org/",
|
||||
"https://yoctoproject.org/documentation",
|
||||
"https://docs.yoctoproject.org/",
|
||||
"http://downloads.yoctoproject.org/releases/opkg/opkg-0.1.7.tar.gz",
|
||||
"http://downloads.yoctoproject.org/releases/opkg/opkg-0.3.0.tar.gz",
|
||||
"ftp://sourceware.org/pub/libffi/libffi-1.20.tar.gz",
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
DISTRO : "3.1.24"
|
||||
DISTRO : "3.1.25"
|
||||
DISTRO_NAME_NO_CAP : "dunfell"
|
||||
DISTRO_NAME : "Dunfell"
|
||||
DISTRO_NAME_NO_CAP_MINUS_ONE : "zeus"
|
||||
YOCTO_DOC_VERSION : "3.1.24"
|
||||
YOCTO_DOC_VERSION : "3.1.25"
|
||||
YOCTO_DOC_VERSION_MINUS_ONE : "3.0.4"
|
||||
DISTRO_REL_TAG : "yocto-3.1.24"
|
||||
DOCCONF_VERSION : "3.1.24"
|
||||
DISTRO_REL_TAG : "yocto-3.1.25"
|
||||
DOCCONF_VERSION : "3.1.25"
|
||||
BITBAKE_SERIES : "1.46"
|
||||
POKYVERSION : "23.0.24"
|
||||
POKYVERSION : "23.0.25"
|
||||
YOCTO_POKY : "poky-&DISTRO_NAME_NO_CAP;-&POKYVERSION;"
|
||||
YOCTO_DL_URL : "https://downloads.yoctoproject.org"
|
||||
YOCTO_AB_URL : "https://autobuilder.yoctoproject.org"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
DISTRO = "poky"
|
||||
DISTRO_NAME = "Poky (Yocto Project Reference Distro)"
|
||||
DISTRO_VERSION = "3.1.24"
|
||||
DISTRO_VERSION = "3.1.25"
|
||||
DISTRO_CODENAME = "dunfell"
|
||||
SDK_VENDOR = "-pokysdk"
|
||||
SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${DATE}', 'snapshot')}"
|
||||
|
||||
1067
meta/classes/create-spdx-2.2.bbclass
Normal file
1067
meta/classes/create-spdx-2.2.bbclass
Normal file
File diff suppressed because it is too large
Load Diff
8
meta/classes/create-spdx.bbclass
Normal file
8
meta/classes/create-spdx.bbclass
Normal file
@@ -0,0 +1,8 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Include this class when you don't care what version of SPDX you get; it will
|
||||
# be updated to the latest stable version that is supported
|
||||
inherit create-spdx-2.2
|
||||
@@ -253,7 +253,7 @@ def check_cves(d, patched_cves):
|
||||
"""
|
||||
Connect to the NVD database and find unpatched cves.
|
||||
"""
|
||||
from oe.cve_check import Version
|
||||
from oe.cve_check import Version, convert_cve_version
|
||||
|
||||
pn = d.getVar("PN")
|
||||
real_pv = d.getVar("PV")
|
||||
@@ -317,6 +317,9 @@ def check_cves(d, patched_cves):
|
||||
if cve in cve_whitelist:
|
||||
ignored = True
|
||||
|
||||
version_start = convert_cve_version(version_start)
|
||||
version_end = convert_cve_version(version_end)
|
||||
|
||||
if (operator_start == '=' and pv == version_start) or version_start == '-':
|
||||
vulnerable = True
|
||||
else:
|
||||
|
||||
@@ -45,6 +45,7 @@ python multilib_virtclass_handler () {
|
||||
e.data.setVar("RECIPE_SYSROOT", "${WORKDIR}/recipe-sysroot")
|
||||
e.data.setVar("STAGING_DIR_TARGET", "${WORKDIR}/recipe-sysroot")
|
||||
e.data.setVar("STAGING_DIR_HOST", "${WORKDIR}/recipe-sysroot")
|
||||
e.data.setVar("RECIPE_SYSROOT_MANIFEST_SUBDIR", "nativesdk-" + variant)
|
||||
e.data.setVar("MLPREFIX", variant + "-")
|
||||
override = ":virtclass-multilib-" + variant
|
||||
e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
|
||||
|
||||
@@ -1140,6 +1140,14 @@ python split_and_strip_files () {
|
||||
# Modified the file so clear the cache
|
||||
cpath.updatecache(file)
|
||||
|
||||
def strip_pkgd_prefix(f):
|
||||
nonlocal dvar
|
||||
|
||||
if f.startswith(dvar):
|
||||
return f[len(dvar):]
|
||||
|
||||
return f
|
||||
|
||||
#
|
||||
# First lets process debug splitting
|
||||
#
|
||||
@@ -1153,6 +1161,8 @@ python split_and_strip_files () {
|
||||
for file in staticlibs:
|
||||
results.append( (file,source_info(file, d)) )
|
||||
|
||||
d.setVar("PKGDEBUGSOURCES", {strip_pkgd_prefix(f): sorted(s) for f, s in results})
|
||||
|
||||
sources = set()
|
||||
for r in results:
|
||||
sources.update(r[1])
|
||||
@@ -1460,6 +1470,7 @@ PKGDATA_VARS = "PN PE PV PR PKGE PKGV PKGR LICENSE DESCRIPTION SUMMARY RDEPENDS
|
||||
python emit_pkgdata() {
|
||||
from glob import glob
|
||||
import json
|
||||
import gzip
|
||||
|
||||
def process_postinst_on_target(pkg, mlprefix):
|
||||
pkgval = d.getVar('PKG_%s' % pkg)
|
||||
@@ -1532,6 +1543,8 @@ fi
|
||||
with open(data_file, 'w') as fd:
|
||||
fd.write("PACKAGES: %s\n" % packages)
|
||||
|
||||
pkgdebugsource = d.getVar("PKGDEBUGSOURCES") or []
|
||||
|
||||
pn = d.getVar('PN')
|
||||
global_variants = (d.getVar('MULTILIB_GLOBAL_VARIANTS') or "").split()
|
||||
variants = (d.getVar('MULTILIB_VARIANTS') or "").split()
|
||||
@@ -1551,17 +1564,32 @@ fi
|
||||
pkgval = pkg
|
||||
d.setVar('PKG_%s' % pkg, pkg)
|
||||
|
||||
extended_data = {
|
||||
"files_info": {}
|
||||
}
|
||||
|
||||
pkgdestpkg = os.path.join(pkgdest, pkg)
|
||||
files = {}
|
||||
files_extra = {}
|
||||
total_size = 0
|
||||
seen = set()
|
||||
for f in pkgfiles[pkg]:
|
||||
relpth = os.path.relpath(f, pkgdestpkg)
|
||||
fpath = os.sep + os.path.relpath(f, pkgdestpkg)
|
||||
|
||||
fstat = os.lstat(f)
|
||||
files[os.sep + relpth] = fstat.st_size
|
||||
files[fpath] = fstat.st_size
|
||||
|
||||
extended_data["files_info"].setdefault(fpath, {})
|
||||
extended_data["files_info"][fpath]['size'] = fstat.st_size
|
||||
|
||||
if fstat.st_ino not in seen:
|
||||
seen.add(fstat.st_ino)
|
||||
total_size += fstat.st_size
|
||||
|
||||
if fpath in pkgdebugsource:
|
||||
extended_data["files_info"][fpath]['debugsrc'] = pkgdebugsource[fpath]
|
||||
del pkgdebugsource[fpath]
|
||||
|
||||
d.setVar('FILES_INFO', json.dumps(files, sort_keys=True))
|
||||
|
||||
process_postinst_on_target(pkg, d.getVar("MLPREFIX"))
|
||||
@@ -1582,6 +1610,10 @@ fi
|
||||
|
||||
sf.write('%s_%s: %d\n' % ('PKGSIZE', pkg, total_size))
|
||||
|
||||
subdata_extended_file = pkgdatadir + "/extended/%s.json.gz" % pkg
|
||||
with gzip.open(subdata_extended_file, "wt", encoding="utf-8") as f:
|
||||
json.dump(extended_data, f, sort_keys=True, separators=(",", ":"))
|
||||
|
||||
# Symlinks needed for rprovides lookup
|
||||
rprov = d.getVar('RPROVIDES_%s' % pkg) or d.getVar('RPROVIDES')
|
||||
if rprov:
|
||||
@@ -1612,7 +1644,8 @@ fi
|
||||
write_extra_runtime_pkgs(global_variants, packages, pkgdatadir)
|
||||
|
||||
}
|
||||
emit_pkgdata[dirs] = "${PKGDESTWORK}/runtime ${PKGDESTWORK}/runtime-reverse ${PKGDESTWORK}/runtime-rprovides"
|
||||
emit_pkgdata[dirs] = "${PKGDESTWORK}/runtime ${PKGDESTWORK}/runtime-reverse ${PKGDESTWORK}/runtime-rprovides ${PKGDESTWORK}/extended"
|
||||
emit_pkgdata[vardepsexclude] = "BB_NUMBER_THREADS"
|
||||
|
||||
ldconfig_postinst_fragment() {
|
||||
if [ x"$D" = "x" ]; then
|
||||
|
||||
@@ -51,6 +51,8 @@ TOOLCHAIN_OUTPUTNAME ?= "${SDK_NAME}-toolchain-${SDK_VERSION}"
|
||||
SDK_ARCHIVE_TYPE ?= "tar.xz"
|
||||
SDK_XZ_COMPRESSION_LEVEL ?= "-9"
|
||||
SDK_XZ_OPTIONS ?= "${XZ_DEFAULTS} ${SDK_XZ_COMPRESSION_LEVEL}"
|
||||
SDK_ZIP_OPTIONS ?= "-y"
|
||||
|
||||
|
||||
# To support different sdk type according to SDK_ARCHIVE_TYPE, now support zip and tar.xz
|
||||
python () {
|
||||
@@ -58,7 +60,7 @@ python () {
|
||||
d.setVar('SDK_ARCHIVE_DEPENDS', 'zip-native')
|
||||
# SDK_ARCHIVE_CMD used to generate archived sdk ${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} from input dir ${SDK_OUTPUT}/${SDKPATH} to output dir ${SDKDEPLOYDIR}
|
||||
# recommand to cd into input dir first to avoid archive with buildpath
|
||||
d.setVar('SDK_ARCHIVE_CMD', 'cd ${SDK_OUTPUT}/${SDKPATH}; zip -r -y ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} .')
|
||||
d.setVar('SDK_ARCHIVE_CMD', 'cd ${SDK_OUTPUT}/${SDKPATH}; zip -r ${SDK_ZIP_OPTIONS} ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE} .')
|
||||
else:
|
||||
d.setVar('SDK_ARCHIVE_DEPENDS', 'xz-native')
|
||||
d.setVar('SDK_ARCHIVE_CMD', 'cd ${SDK_OUTPUT}/${SDKPATH}; tar ${SDKTAROPTS} -cf - . | xz ${SDK_XZ_OPTIONS} > ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.${SDK_ARCHIVE_TYPE}')
|
||||
|
||||
@@ -669,7 +669,7 @@ sdk_ext_postinst() {
|
||||
|
||||
# A bit of another hack, but we need this in the path only for devtool
|
||||
# so put it at the end of $PATH.
|
||||
echo "export PATH=$target_sdk_dir/sysroots/${SDK_SYS}${bindir_nativesdk}:\$PATH" >> $env_setup_script
|
||||
echo "export PATH=\"$target_sdk_dir/sysroots/${SDK_SYS}${bindir_nativesdk}:\$PATH\"" >> $env_setup_script
|
||||
|
||||
echo "printf 'SDK environment now set up; additionally you may now run devtool to perform development tasks.\nRun devtool --help for further details.\n'" >> $env_setup_script
|
||||
|
||||
|
||||
@@ -267,6 +267,10 @@ python extend_recipe_sysroot() {
|
||||
pn = d.getVar("PN")
|
||||
stagingdir = d.getVar("STAGING_DIR")
|
||||
sharedmanifests = d.getVar("COMPONENTS_DIR") + "/manifests"
|
||||
# only needed by multilib cross-canadian since it redefines RECIPE_SYSROOT
|
||||
manifestprefix = d.getVar("RECIPE_SYSROOT_MANIFEST_SUBDIR")
|
||||
if manifestprefix:
|
||||
sharedmanifests = sharedmanifests + "/" + manifestprefix
|
||||
recipesysroot = d.getVar("RECIPE_SYSROOT")
|
||||
recipesysrootnative = d.getVar("RECIPE_SYSROOT_NATIVE")
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ toolchain_create_sdk_env_script () {
|
||||
for i in ${CANADIANEXTRAOS}; do
|
||||
EXTRAPATH="$EXTRAPATH:$sdkpathnative$bindir/${TARGET_ARCH}${TARGET_VENDOR}-$i"
|
||||
done
|
||||
echo "export PATH=$sdkpathnative$bindir:$sdkpathnative$sbindir:$sdkpathnative$base_bindir:$sdkpathnative$base_sbindir:$sdkpathnative$bindir/../${HOST_SYS}/bin:$sdkpathnative$bindir/${TARGET_SYS}"$EXTRAPATH':$PATH' >> $script
|
||||
echo "export PATH=$sdkpathnative$bindir:$sdkpathnative$sbindir:$sdkpathnative$base_bindir:$sdkpathnative$base_sbindir:$sdkpathnative$bindir/../${HOST_SYS}/bin:$sdkpathnative$bindir/${TARGET_SYS}"$EXTRAPATH':"$PATH"' >> $script
|
||||
echo 'export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT' >> $script
|
||||
echo 'export PKG_CONFIG_PATH=$SDKTARGETSYSROOT'"$libdir"'/pkgconfig:$SDKTARGETSYSROOT'"$prefix"'/share/pkgconfig' >> $script
|
||||
echo 'export CONFIG_SITE=${SDKPATH}/site-config-'"${multimach_target_sys}" >> $script
|
||||
|
||||
@@ -22,21 +22,28 @@ SPDXLICENSEMAP[GPLv1.0] = "GPL-1.0"
|
||||
SPDXLICENSEMAP[GPL-1.0-only] = "GPL-1.0"
|
||||
SPDXLICENSEMAP[GPL-2] = "GPL-2.0"
|
||||
SPDXLICENSEMAP[GPLv2] = "GPL-2.0"
|
||||
SPDXLICENSEMAP[GPLv2+] = "GPL-2.0+"
|
||||
SPDXLICENSEMAP[GPLv2.0] = "GPL-2.0"
|
||||
SPDXLICENSEMAP[GPLv2.0+] = "GPL-2.0+"
|
||||
SPDXLICENSEMAP[GPL-2.0-only] = "GPL-2.0"
|
||||
SPDXLICENSEMAP[GPL-3] = "GPL-3.0"
|
||||
SPDXLICENSEMAP[GPLv3] = "GPL-3.0"
|
||||
SPDXLICENSEMAP[GPLv3+] = "GPL-3.0+"
|
||||
SPDXLICENSEMAP[GPLv3.0] = "GPL-3.0"
|
||||
SPDXLICENSEMAP[GPLv3.0+] = "GPL-3.0+"
|
||||
SPDXLICENSEMAP[GPL-3.0-only] = "GPL-3.0"
|
||||
|
||||
#LGPL variations
|
||||
SPDXLICENSEMAP[LGPLv2] = "LGPL-2.0"
|
||||
SPDXLICENSEMAP[LGPLv2+] = "LGPL-2.0+"
|
||||
SPDXLICENSEMAP[LGPLv2.0] = "LGPL-2.0"
|
||||
SPDXLICENSEMAP[LGPL-2.0-only] = "LGPL-2.0"
|
||||
SPDXLICENSEMAP[LGPL2.1] = "LGPL-2.1"
|
||||
SPDXLICENSEMAP[LGPLv2.1] = "LGPL-2.1"
|
||||
SPDXLICENSEMAP[LGPLv2.1+] = "LGPL-2.1+"
|
||||
SPDXLICENSEMAP[LGPL-2.1-only] = "LGPL-2.1"
|
||||
SPDXLICENSEMAP[LGPLv3] = "LGPL-3.0"
|
||||
SPDXLICENSEMAP[LGPLv3+] = "LGPL-3.0+"
|
||||
SPDXLICENSEMAP[LGPL-3.0-only] = "LGPL-3.0"
|
||||
|
||||
#MPL variations
|
||||
|
||||
5937
meta/files/spdx-licenses.json
Normal file
5937
meta/files/spdx-licenses.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -172,3 +172,40 @@ def get_cpe_ids(cve_product, version):
|
||||
cpe_ids.append(cpe_id)
|
||||
|
||||
return cpe_ids
|
||||
|
||||
def convert_cve_version(version):
|
||||
"""
|
||||
This function converts from CVE format to Yocto version format.
|
||||
eg 8.3_p1 -> 8.3p1, 6.2_rc1 -> 6.2-rc1
|
||||
|
||||
Unless it is redefined using CVE_VERSION in the recipe,
|
||||
cve_check uses the version in the name of the recipe (${PV})
|
||||
to check vulnerabilities against a CVE in the database downloaded from NVD.
|
||||
|
||||
When the version has an update, i.e.
|
||||
"p1" in OpenSSH 8.3p1,
|
||||
"-rc1" in linux kernel 6.2-rc1,
|
||||
the database stores the version as version_update (8.3_p1, 6.2_rc1).
|
||||
Therefore, we must transform this version before comparing to the
|
||||
recipe version.
|
||||
|
||||
In this case, the parameter of the function is 8.3_p1.
|
||||
If the version uses the Release Candidate format, "rc",
|
||||
this function replaces the '_' by '-'.
|
||||
If the version uses the Update format, "p",
|
||||
this function removes the '_' completely.
|
||||
"""
|
||||
import re
|
||||
|
||||
matches = re.match('^([0-9.]+)_((p|rc)[0-9]+)$', version)
|
||||
|
||||
if not matches:
|
||||
return version
|
||||
|
||||
version = matches.group(1)
|
||||
update = matches.group(2)
|
||||
|
||||
if matches.group(3) == "rc":
|
||||
return version + '-' + update
|
||||
|
||||
return version + update
|
||||
|
||||
@@ -57,6 +57,17 @@ def read_subpkgdata_dict(pkg, d):
|
||||
ret[newvar] = subd[var]
|
||||
return ret
|
||||
|
||||
def read_subpkgdata_extended(pkg, d):
|
||||
import json
|
||||
import gzip
|
||||
|
||||
fn = d.expand("${PKGDATA_DIR}/extended/%s.json.gz" % pkg)
|
||||
try:
|
||||
with gzip.open(fn, "rt", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
|
||||
def _pkgmap(d):
|
||||
"""Return a dictionary mapping package to recipe name."""
|
||||
|
||||
|
||||
84
meta/lib/oe/sbom.py
Normal file
84
meta/lib/oe/sbom.py
Normal file
@@ -0,0 +1,84 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
|
||||
import collections
|
||||
|
||||
DepRecipe = collections.namedtuple("DepRecipe", ("doc", "doc_sha1", "recipe"))
|
||||
DepSource = collections.namedtuple("DepSource", ("doc", "doc_sha1", "recipe", "file"))
|
||||
|
||||
|
||||
def get_recipe_spdxid(d):
|
||||
return "SPDXRef-%s-%s" % ("Recipe", d.getVar("PN"))
|
||||
|
||||
|
||||
def get_download_spdxid(d, idx):
|
||||
return "SPDXRef-Download-%s-%d" % (d.getVar("PN"), idx)
|
||||
|
||||
|
||||
def get_package_spdxid(pkg):
|
||||
return "SPDXRef-Package-%s" % pkg
|
||||
|
||||
|
||||
def get_source_file_spdxid(d, idx):
|
||||
return "SPDXRef-SourceFile-%s-%d" % (d.getVar("PN"), idx)
|
||||
|
||||
|
||||
def get_packaged_file_spdxid(pkg, idx):
|
||||
return "SPDXRef-PackagedFile-%s-%d" % (pkg, idx)
|
||||
|
||||
|
||||
def get_image_spdxid(img):
|
||||
return "SPDXRef-Image-%s" % img
|
||||
|
||||
|
||||
def get_sdk_spdxid(sdk):
|
||||
return "SPDXRef-SDK-%s" % sdk
|
||||
|
||||
|
||||
def write_doc(d, spdx_doc, subdir, spdx_deploy=None, indent=None):
|
||||
from pathlib import Path
|
||||
|
||||
if spdx_deploy is None:
|
||||
spdx_deploy = Path(d.getVar("SPDXDEPLOY"))
|
||||
|
||||
dest = spdx_deploy / subdir / (spdx_doc.name + ".spdx.json")
|
||||
dest.parent.mkdir(exist_ok=True, parents=True)
|
||||
with dest.open("wb") as f:
|
||||
doc_sha1 = spdx_doc.to_json(f, sort_keys=True, indent=indent)
|
||||
|
||||
l = spdx_deploy / "by-namespace" / spdx_doc.documentNamespace.replace("/", "_")
|
||||
l.parent.mkdir(exist_ok=True, parents=True)
|
||||
l.symlink_to(os.path.relpath(dest, l.parent))
|
||||
|
||||
return doc_sha1
|
||||
|
||||
|
||||
def read_doc(fn):
|
||||
import hashlib
|
||||
import oe.spdx
|
||||
import io
|
||||
import contextlib
|
||||
|
||||
@contextlib.contextmanager
|
||||
def get_file():
|
||||
if isinstance(fn, io.IOBase):
|
||||
yield fn
|
||||
else:
|
||||
with fn.open("rb") as f:
|
||||
yield f
|
||||
|
||||
with get_file() as f:
|
||||
sha1 = hashlib.sha1()
|
||||
while True:
|
||||
chunk = f.read(4096)
|
||||
if not chunk:
|
||||
break
|
||||
sha1.update(chunk)
|
||||
|
||||
f.seek(0)
|
||||
doc = oe.spdx.SPDXDocument.from_json(f)
|
||||
|
||||
return (doc, sha1.hexdigest())
|
||||
357
meta/lib/oe/spdx.py
Normal file
357
meta/lib/oe/spdx.py
Normal file
@@ -0,0 +1,357 @@
|
||||
#
|
||||
# Copyright OpenEmbedded Contributors
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
|
||||
#
|
||||
# This library is intended to capture the JSON SPDX specification in a type
|
||||
# safe manner. It is not intended to encode any particular OE specific
|
||||
# behaviors, see the sbom.py for that.
|
||||
#
|
||||
# The documented SPDX spec document doesn't cover the JSON syntax for
|
||||
# particular configuration, which can make it hard to determine what the JSON
|
||||
# syntax should be. I've found it is actually much simpler to read the official
|
||||
# SPDX JSON schema which can be found here: https://github.com/spdx/spdx-spec
|
||||
# in schemas/spdx-schema.json
|
||||
#
|
||||
|
||||
import hashlib
|
||||
import itertools
|
||||
import json
|
||||
|
||||
SPDX_VERSION = "2.2"
|
||||
|
||||
|
||||
#
|
||||
# The following are the support classes that are used to implement SPDX object
|
||||
#
|
||||
|
||||
class _Property(object):
|
||||
"""
|
||||
A generic SPDX object property. The different types will derive from this
|
||||
class
|
||||
"""
|
||||
|
||||
def __init__(self, *, default=None):
|
||||
self.default = default
|
||||
|
||||
def setdefault(self, dest, name):
|
||||
if self.default is not None:
|
||||
dest.setdefault(name, self.default)
|
||||
|
||||
|
||||
class _String(_Property):
|
||||
"""
|
||||
A scalar string property for an SPDX object
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
def set_property(self, attrs, name):
|
||||
def get_helper(obj):
|
||||
return obj._spdx[name]
|
||||
|
||||
def set_helper(obj, value):
|
||||
obj._spdx[name] = value
|
||||
|
||||
def del_helper(obj):
|
||||
del obj._spdx[name]
|
||||
|
||||
attrs[name] = property(get_helper, set_helper, del_helper)
|
||||
|
||||
def init(self, source):
|
||||
return source
|
||||
|
||||
|
||||
class _Object(_Property):
|
||||
"""
|
||||
A scalar SPDX object property of a SPDX object
|
||||
"""
|
||||
|
||||
def __init__(self, cls, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.cls = cls
|
||||
|
||||
def set_property(self, attrs, name):
|
||||
def get_helper(obj):
|
||||
if not name in obj._spdx:
|
||||
obj._spdx[name] = self.cls()
|
||||
return obj._spdx[name]
|
||||
|
||||
def set_helper(obj, value):
|
||||
obj._spdx[name] = value
|
||||
|
||||
def del_helper(obj):
|
||||
del obj._spdx[name]
|
||||
|
||||
attrs[name] = property(get_helper, set_helper)
|
||||
|
||||
def init(self, source):
|
||||
return self.cls(**source)
|
||||
|
||||
|
||||
class _ListProperty(_Property):
|
||||
"""
|
||||
A list of SPDX properties
|
||||
"""
|
||||
|
||||
def __init__(self, prop, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.prop = prop
|
||||
|
||||
def set_property(self, attrs, name):
|
||||
def get_helper(obj):
|
||||
if not name in obj._spdx:
|
||||
obj._spdx[name] = []
|
||||
return obj._spdx[name]
|
||||
|
||||
def set_helper(obj, value):
|
||||
obj._spdx[name] = list(value)
|
||||
|
||||
def del_helper(obj):
|
||||
del obj._spdx[name]
|
||||
|
||||
attrs[name] = property(get_helper, set_helper, del_helper)
|
||||
|
||||
def init(self, source):
|
||||
return [self.prop.init(o) for o in source]
|
||||
|
||||
|
||||
class _StringList(_ListProperty):
|
||||
"""
|
||||
A list of strings as a property for an SPDX object
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(_String(), **kwargs)
|
||||
|
||||
|
||||
class _ObjectList(_ListProperty):
|
||||
"""
|
||||
A list of SPDX objects as a property for an SPDX object
|
||||
"""
|
||||
|
||||
def __init__(self, cls, **kwargs):
|
||||
super().__init__(_Object(cls), **kwargs)
|
||||
|
||||
|
||||
class MetaSPDXObject(type):
|
||||
"""
|
||||
A metaclass that allows properties (anything derived from a _Property
|
||||
class) to be defined for a SPDX object
|
||||
"""
|
||||
def __new__(mcls, name, bases, attrs):
|
||||
attrs["_properties"] = {}
|
||||
|
||||
for key in attrs.keys():
|
||||
if isinstance(attrs[key], _Property):
|
||||
prop = attrs[key]
|
||||
attrs["_properties"][key] = prop
|
||||
prop.set_property(attrs, key)
|
||||
|
||||
return super().__new__(mcls, name, bases, attrs)
|
||||
|
||||
|
||||
class SPDXObject(metaclass=MetaSPDXObject):
|
||||
"""
|
||||
The base SPDX object; all SPDX spec classes must derive from this class
|
||||
"""
|
||||
def __init__(self, **d):
|
||||
self._spdx = {}
|
||||
|
||||
for name, prop in self._properties.items():
|
||||
prop.setdefault(self._spdx, name)
|
||||
if name in d:
|
||||
self._spdx[name] = prop.init(d[name])
|
||||
|
||||
def serializer(self):
|
||||
return self._spdx
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
if name in self._properties or name == "_spdx":
|
||||
super().__setattr__(name, value)
|
||||
return
|
||||
raise KeyError("%r is not a valid SPDX property" % name)
|
||||
|
||||
#
|
||||
# These are the SPDX objects implemented from the spec. The *only* properties
|
||||
# that can be added to these objects are ones directly specified in the SPDX
|
||||
# spec, however you may add helper functions to make operations easier.
|
||||
#
|
||||
# Defaults should *only* be specified if the SPDX spec says there is a certain
|
||||
# required value for a field (e.g. dataLicense), or if the field is mandatory
|
||||
# and has some sane "this field is unknown" (e.g. "NOASSERTION")
|
||||
#
|
||||
|
||||
class SPDXAnnotation(SPDXObject):
|
||||
annotationDate = _String()
|
||||
annotationType = _String()
|
||||
annotator = _String()
|
||||
comment = _String()
|
||||
|
||||
class SPDXChecksum(SPDXObject):
|
||||
algorithm = _String()
|
||||
checksumValue = _String()
|
||||
|
||||
|
||||
class SPDXRelationship(SPDXObject):
|
||||
spdxElementId = _String()
|
||||
relatedSpdxElement = _String()
|
||||
relationshipType = _String()
|
||||
comment = _String()
|
||||
annotations = _ObjectList(SPDXAnnotation)
|
||||
|
||||
|
||||
class SPDXExternalReference(SPDXObject):
|
||||
referenceCategory = _String()
|
||||
referenceType = _String()
|
||||
referenceLocator = _String()
|
||||
|
||||
|
||||
class SPDXPackageVerificationCode(SPDXObject):
|
||||
packageVerificationCodeValue = _String()
|
||||
packageVerificationCodeExcludedFiles = _StringList()
|
||||
|
||||
|
||||
class SPDXPackage(SPDXObject):
|
||||
ALLOWED_CHECKSUMS = [
|
||||
"SHA1",
|
||||
"SHA224",
|
||||
"SHA256",
|
||||
"SHA384",
|
||||
"SHA512",
|
||||
"MD2",
|
||||
"MD4",
|
||||
"MD5",
|
||||
"MD6",
|
||||
]
|
||||
|
||||
name = _String()
|
||||
SPDXID = _String()
|
||||
versionInfo = _String()
|
||||
downloadLocation = _String(default="NOASSERTION")
|
||||
supplier = _String(default="NOASSERTION")
|
||||
homepage = _String()
|
||||
licenseConcluded = _String(default="NOASSERTION")
|
||||
licenseDeclared = _String(default="NOASSERTION")
|
||||
summary = _String()
|
||||
description = _String()
|
||||
sourceInfo = _String()
|
||||
copyrightText = _String(default="NOASSERTION")
|
||||
licenseInfoFromFiles = _StringList(default=["NOASSERTION"])
|
||||
externalRefs = _ObjectList(SPDXExternalReference)
|
||||
packageVerificationCode = _Object(SPDXPackageVerificationCode)
|
||||
hasFiles = _StringList()
|
||||
packageFileName = _String()
|
||||
annotations = _ObjectList(SPDXAnnotation)
|
||||
checksums = _ObjectList(SPDXChecksum)
|
||||
|
||||
|
||||
class SPDXFile(SPDXObject):
|
||||
SPDXID = _String()
|
||||
fileName = _String()
|
||||
licenseConcluded = _String(default="NOASSERTION")
|
||||
copyrightText = _String(default="NOASSERTION")
|
||||
licenseInfoInFiles = _StringList(default=["NOASSERTION"])
|
||||
checksums = _ObjectList(SPDXChecksum)
|
||||
fileTypes = _StringList()
|
||||
|
||||
|
||||
class SPDXCreationInfo(SPDXObject):
|
||||
created = _String()
|
||||
licenseListVersion = _String()
|
||||
comment = _String()
|
||||
creators = _StringList()
|
||||
|
||||
|
||||
class SPDXExternalDocumentRef(SPDXObject):
|
||||
externalDocumentId = _String()
|
||||
spdxDocument = _String()
|
||||
checksum = _Object(SPDXChecksum)
|
||||
|
||||
|
||||
class SPDXExtractedLicensingInfo(SPDXObject):
|
||||
name = _String()
|
||||
comment = _String()
|
||||
licenseId = _String()
|
||||
extractedText = _String()
|
||||
|
||||
|
||||
class SPDXDocument(SPDXObject):
|
||||
spdxVersion = _String(default="SPDX-" + SPDX_VERSION)
|
||||
dataLicense = _String(default="CC0-1.0")
|
||||
SPDXID = _String(default="SPDXRef-DOCUMENT")
|
||||
name = _String()
|
||||
documentNamespace = _String()
|
||||
creationInfo = _Object(SPDXCreationInfo)
|
||||
packages = _ObjectList(SPDXPackage)
|
||||
files = _ObjectList(SPDXFile)
|
||||
relationships = _ObjectList(SPDXRelationship)
|
||||
externalDocumentRefs = _ObjectList(SPDXExternalDocumentRef)
|
||||
hasExtractedLicensingInfos = _ObjectList(SPDXExtractedLicensingInfo)
|
||||
|
||||
def __init__(self, **d):
|
||||
super().__init__(**d)
|
||||
|
||||
def to_json(self, f, *, sort_keys=False, indent=None, separators=None):
|
||||
class Encoder(json.JSONEncoder):
|
||||
def default(self, o):
|
||||
if isinstance(o, SPDXObject):
|
||||
return o.serializer()
|
||||
|
||||
return super().default(o)
|
||||
|
||||
sha1 = hashlib.sha1()
|
||||
for chunk in Encoder(
|
||||
sort_keys=sort_keys,
|
||||
indent=indent,
|
||||
separators=separators,
|
||||
).iterencode(self):
|
||||
chunk = chunk.encode("utf-8")
|
||||
f.write(chunk)
|
||||
sha1.update(chunk)
|
||||
|
||||
return sha1.hexdigest()
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, f):
|
||||
return cls(**json.load(f))
|
||||
|
||||
def add_relationship(self, _from, relationship, _to, *, comment=None, annotation=None):
|
||||
if isinstance(_from, SPDXObject):
|
||||
from_spdxid = _from.SPDXID
|
||||
else:
|
||||
from_spdxid = _from
|
||||
|
||||
if isinstance(_to, SPDXObject):
|
||||
to_spdxid = _to.SPDXID
|
||||
else:
|
||||
to_spdxid = _to
|
||||
|
||||
r = SPDXRelationship(
|
||||
spdxElementId=from_spdxid,
|
||||
relatedSpdxElement=to_spdxid,
|
||||
relationshipType=relationship,
|
||||
)
|
||||
|
||||
if comment is not None:
|
||||
r.comment = comment
|
||||
|
||||
if annotation is not None:
|
||||
r.annotations.append(annotation)
|
||||
|
||||
self.relationships.append(r)
|
||||
|
||||
def find_by_spdxid(self, spdxid):
|
||||
for o in itertools.chain(self.packages, self.files):
|
||||
if o.SPDXID == spdxid:
|
||||
return o
|
||||
return None
|
||||
|
||||
def find_external_document_ref(self, namespace):
|
||||
for r in self.externalDocumentRefs:
|
||||
if r.spdxDocument == namespace:
|
||||
return r
|
||||
return None
|
||||
@@ -1,5 +1,6 @@
|
||||
from oeqa.runtime.case import OERuntimeTestCase
|
||||
from oeqa.core.decorator.depends import OETestDepends
|
||||
from oeqa.core.decorator.data import skipIfFeature
|
||||
from oeqa.runtime.decorator.package import OEHasPackage
|
||||
|
||||
import re
|
||||
@@ -16,12 +17,14 @@ class RTCTest(OERuntimeTestCase):
|
||||
self.logger.debug('Starting systemd-timesyncd daemon')
|
||||
self.target.run('systemctl enable --now --runtime systemd-timesyncd')
|
||||
|
||||
@skipIfFeature('read-only-rootfs',
|
||||
'Test does not work with read-only-rootfs in IMAGE_FEATURES')
|
||||
@OETestDepends(['ssh.SSHTest.test_ssh'])
|
||||
@OEHasPackage(['coreutils', 'busybox'])
|
||||
def test_rtc(self):
|
||||
(status, output) = self.target.run('hwclock -r')
|
||||
self.assertEqual(status, 0, msg='Failed to get RTC time, output: %s' % output)
|
||||
|
||||
|
||||
(status, current_datetime) = self.target.run('date +"%m%d%H%M%Y"')
|
||||
self.assertEqual(status, 0, msg='Failed to get system current date & time, output: %s' % current_datetime)
|
||||
|
||||
@@ -32,7 +35,6 @@ class RTCTest(OERuntimeTestCase):
|
||||
|
||||
(status, output) = self.target.run('date %s' % current_datetime)
|
||||
self.assertEqual(status, 0, msg='Failed to reset system date & time, output: %s' % output)
|
||||
|
||||
|
||||
(status, output) = self.target.run('hwclock -w')
|
||||
self.assertEqual(status, 0, msg='Failed to reset RTC time, output: %s' % output)
|
||||
|
||||
|
||||
@@ -48,6 +48,25 @@ class CVECheck(OESelftestTestCase):
|
||||
self.assertTrue( result ,msg="Failed to compare version with suffix '1.0_patch2' < '1.0_patch3'")
|
||||
|
||||
|
||||
def test_convert_cve_version(self):
|
||||
from oe.cve_check import convert_cve_version
|
||||
|
||||
# Default format
|
||||
self.assertEqual(convert_cve_version("8.3"), "8.3")
|
||||
self.assertEqual(convert_cve_version(""), "")
|
||||
|
||||
# OpenSSL format version
|
||||
self.assertEqual(convert_cve_version("1.1.1t"), "1.1.1t")
|
||||
|
||||
# OpenSSH format
|
||||
self.assertEqual(convert_cve_version("8.3_p1"), "8.3p1")
|
||||
self.assertEqual(convert_cve_version("8.3_p22"), "8.3p22")
|
||||
|
||||
# Linux kernel format
|
||||
self.assertEqual(convert_cve_version("6.2_rc8"), "6.2-rc8")
|
||||
self.assertEqual(convert_cve_version("6.2_rc31"), "6.2-rc31")
|
||||
|
||||
|
||||
def test_recipe_report_json(self):
|
||||
config = """
|
||||
INHERIT += "cve-check"
|
||||
|
||||
226
meta/recipes-connectivity/openssl/openssl/CVE-2023-0464.patch
Normal file
226
meta/recipes-connectivity/openssl/openssl/CVE-2023-0464.patch
Normal file
@@ -0,0 +1,226 @@
|
||||
From 879f7080d7e141f415c79eaa3a8ac4a3dad0348b Mon Sep 17 00:00:00 2001
|
||||
From: Pauli <pauli@openssl.org>
|
||||
Date: Wed, 8 Mar 2023 15:28:20 +1100
|
||||
Subject: [PATCH] x509: excessive resource use verifying policy constraints
|
||||
|
||||
A security vulnerability has been identified in all supported versions
|
||||
of OpenSSL related to the verification of X.509 certificate chains
|
||||
that include policy constraints. Attackers may be able to exploit this
|
||||
vulnerability by creating a malicious certificate chain that triggers
|
||||
exponential use of computational resources, leading to a denial-of-service
|
||||
(DoS) attack on affected systems.
|
||||
|
||||
Fixes CVE-2023-0464
|
||||
|
||||
Reviewed-by: Tomas Mraz <tomas@openssl.org>
|
||||
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
|
||||
(Merged from https://github.com/openssl/openssl/pull/20569)
|
||||
|
||||
CVE: CVE-2023-0464
|
||||
Upstream-Status: Backport [https://git.openssl.org/gitweb/?p=openssl.git;a=patch;h=879f7080d7e141f415c79eaa3a8ac4a3dad0348b]
|
||||
Signed-off-by: Nikhil R <nikhil.r@kpit.com>
|
||||
|
||||
---
|
||||
crypto/x509v3/pcy_local.h | 8 +++++++-
|
||||
crypto/x509v3/pcy_node.c | 12 +++++++++---
|
||||
crypto/x509v3/pcy_tree.c | 37 +++++++++++++++++++++++++++----------
|
||||
3 files changed, 43 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/crypto/x509v3/pcy_local.h b/crypto/x509v3/pcy_local.h
|
||||
index 5daf78de45..344aa06765 100644
|
||||
--- a/crypto/x509v3/pcy_local.h
|
||||
+++ b/crypto/x509v3/pcy_local.h
|
||||
@@ -111,6 +111,11 @@ struct X509_POLICY_LEVEL_st {
|
||||
};
|
||||
|
||||
struct X509_POLICY_TREE_st {
|
||||
+ /* The number of nodes in the tree */
|
||||
+ size_t node_count;
|
||||
+ /* The maximum number of nodes in the tree */
|
||||
+ size_t node_maximum;
|
||||
+
|
||||
/* This is the tree 'level' data */
|
||||
X509_POLICY_LEVEL *levels;
|
||||
int nlevel;
|
||||
@@ -159,7 +164,8 @@ X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *sk,
|
||||
X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
|
||||
X509_POLICY_DATA *data,
|
||||
X509_POLICY_NODE *parent,
|
||||
- X509_POLICY_TREE *tree);
|
||||
+ X509_POLICY_TREE *tree,
|
||||
+ int extra_data);
|
||||
void policy_node_free(X509_POLICY_NODE *node);
|
||||
int policy_node_match(const X509_POLICY_LEVEL *lvl,
|
||||
const X509_POLICY_NODE *node, const ASN1_OBJECT *oid);
|
||||
diff --git a/crypto/x509v3/pcy_node.c b/crypto/x509v3/pcy_node.c
|
||||
index e2d7b15322..d574fb9d66 100644
|
||||
--- a/crypto/x509v3/pcy_node.c
|
||||
+++ b/crypto/x509v3/pcy_node.c
|
||||
@@ -59,10 +59,15 @@ X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level,
|
||||
X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
|
||||
X509_POLICY_DATA *data,
|
||||
X509_POLICY_NODE *parent,
|
||||
- X509_POLICY_TREE *tree)
|
||||
+ X509_POLICY_TREE *tree,
|
||||
+ int extra_data)
|
||||
{
|
||||
X509_POLICY_NODE *node;
|
||||
|
||||
+ /* Verify that the tree isn't too large. This mitigates CVE-2023-0464 */
|
||||
+ if (tree->node_maximum > 0 && tree->node_count >= tree->node_maximum)
|
||||
+ return NULL;
|
||||
+
|
||||
node = OPENSSL_zalloc(sizeof(*node));
|
||||
if (node == NULL) {
|
||||
X509V3err(X509V3_F_LEVEL_ADD_NODE, ERR_R_MALLOC_FAILURE);
|
||||
@@ -70,7 +75,7 @@ X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
|
||||
}
|
||||
node->data = data;
|
||||
node->parent = parent;
|
||||
- if (level) {
|
||||
+ if (level != NULL) {
|
||||
if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
|
||||
if (level->anyPolicy)
|
||||
goto node_error;
|
||||
@@ -90,7 +95,7 @@ X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
|
||||
}
|
||||
}
|
||||
|
||||
- if (tree) {
|
||||
+ if (extra_data) {
|
||||
if (tree->extra_data == NULL)
|
||||
tree->extra_data = sk_X509_POLICY_DATA_new_null();
|
||||
if (tree->extra_data == NULL){
|
||||
@@ -103,6 +108,7 @@ X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level,
|
||||
}
|
||||
}
|
||||
|
||||
+ tree->node_count++;
|
||||
if (parent)
|
||||
parent->nchild++;
|
||||
|
||||
diff --git a/crypto/x509v3/pcy_tree.c b/crypto/x509v3/pcy_tree.c
|
||||
index 6e8322cbc5..6c7fd35405 100644
|
||||
--- a/crypto/x509v3/pcy_tree.c
|
||||
+++ b/crypto/x509v3/pcy_tree.c
|
||||
@@ -13,6 +13,18 @@
|
||||
|
||||
#include "pcy_local.h"
|
||||
|
||||
+/*
|
||||
+ * If the maximum number of nodes in the policy tree isn't defined, set it to
|
||||
+ * a generous default of 1000 nodes.
|
||||
+ *
|
||||
+ * Defining this to be zero means unlimited policy tree growth which opens the
|
||||
+ * door on CVE-2023-0464.
|
||||
+ */
|
||||
+
|
||||
+#ifndef OPENSSL_POLICY_TREE_NODES_MAX
|
||||
+# define OPENSSL_POLICY_TREE_NODES_MAX 1000
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Enable this to print out the complete policy tree at various point during
|
||||
* evaluation.
|
||||
@@ -168,6 +180,9 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
|
||||
return X509_PCY_TREE_INTERNAL;
|
||||
}
|
||||
|
||||
+ /* Limit the growth of the tree to mitigate CVE-2023-0464 */
|
||||
+ tree->node_maximum = OPENSSL_POLICY_TREE_NODES_MAX;
|
||||
+
|
||||
/*
|
||||
* http://tools.ietf.org/html/rfc5280#section-6.1.2, figure 3.
|
||||
*
|
||||
@@ -184,7 +199,7 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
|
||||
level = tree->levels;
|
||||
if ((data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0)) == NULL)
|
||||
goto bad_tree;
|
||||
- if (level_add_node(level, data, NULL, tree) == NULL) {
|
||||
+ if (level_add_node(level, data, NULL, tree, 1) == NULL) {
|
||||
policy_data_free(data);
|
||||
goto bad_tree;
|
||||
}
|
||||
@@ -243,7 +258,8 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
|
||||
* Return value: 1 on success, 0 otherwise
|
||||
*/
|
||||
static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
|
||||
- X509_POLICY_DATA *data)
|
||||
+ X509_POLICY_DATA *data,
|
||||
+ X509_POLICY_TREE *tree)
|
||||
{
|
||||
X509_POLICY_LEVEL *last = curr - 1;
|
||||
int i, matched = 0;
|
||||
@@ -253,13 +269,13 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
|
||||
X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(last->nodes, i);
|
||||
|
||||
if (policy_node_match(last, node, data->valid_policy)) {
|
||||
- if (level_add_node(curr, data, node, NULL) == NULL)
|
||||
+ if (level_add_node(curr, data, node, tree, 0) == NULL)
|
||||
return 0;
|
||||
matched = 1;
|
||||
}
|
||||
}
|
||||
if (!matched && last->anyPolicy) {
|
||||
- if (level_add_node(curr, data, last->anyPolicy, NULL) == NULL)
|
||||
+ if (level_add_node(curr, data, last->anyPolicy, tree, 0) == NULL)
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
@@ -272,7 +288,8 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
|
||||
* Return value: 1 on success, 0 otherwise.
|
||||
*/
|
||||
static int tree_link_nodes(X509_POLICY_LEVEL *curr,
|
||||
- const X509_POLICY_CACHE *cache)
|
||||
+ const X509_POLICY_CACHE *cache,
|
||||
+ X509_POLICY_TREE *tree)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -280,7 +297,7 @@ static int tree_link_nodes(X509_POLICY_LEVEL *curr,
|
||||
X509_POLICY_DATA *data = sk_X509_POLICY_DATA_value(cache->data, i);
|
||||
|
||||
/* Look for matching nodes in previous level */
|
||||
- if (!tree_link_matching_nodes(curr, data))
|
||||
+ if (!tree_link_matching_nodes(curr, data, tree))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
@@ -311,7 +328,7 @@ static int tree_add_unmatched(X509_POLICY_LEVEL *curr,
|
||||
/* Curr may not have anyPolicy */
|
||||
data->qualifier_set = cache->anyPolicy->qualifier_set;
|
||||
data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
|
||||
- if (level_add_node(curr, data, node, tree) == NULL) {
|
||||
+ if (level_add_node(curr, data, node, tree, 1) == NULL) {
|
||||
policy_data_free(data);
|
||||
return 0;
|
||||
}
|
||||
@@ -373,7 +390,7 @@ static int tree_link_any(X509_POLICY_LEVEL *curr,
|
||||
}
|
||||
/* Finally add link to anyPolicy */
|
||||
if (last->anyPolicy &&
|
||||
- level_add_node(curr, cache->anyPolicy, last->anyPolicy, NULL) == NULL)
|
||||
+ level_add_node(curr, cache->anyPolicy, last->anyPolicy, tree, 0) == NULL)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
@@ -555,7 +572,7 @@ static int tree_calculate_user_set(X509_POLICY_TREE *tree,
|
||||
extra->qualifier_set = anyPolicy->data->qualifier_set;
|
||||
extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS
|
||||
| POLICY_DATA_FLAG_EXTRA_NODE;
|
||||
- node = level_add_node(NULL, extra, anyPolicy->parent, tree);
|
||||
+ node = level_add_node(NULL, extra, anyPolicy->parent, tree, 1);
|
||||
}
|
||||
if (!tree->user_policies) {
|
||||
tree->user_policies = sk_X509_POLICY_NODE_new_null();
|
||||
@@ -582,7 +599,7 @@ static int tree_evaluate(X509_POLICY_TREE *tree)
|
||||
|
||||
for (i = 1; i < tree->nlevel; i++, curr++) {
|
||||
cache = policy_cache_set(curr->cert);
|
||||
- if (!tree_link_nodes(curr, cache))
|
||||
+ if (!tree_link_nodes(curr, cache, tree))
|
||||
return X509_PCY_TREE_INTERNAL;
|
||||
|
||||
if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY)
|
||||
--
|
||||
2.34.1
|
||||
@@ -0,0 +1,60 @@
|
||||
From b013765abfa80036dc779dd0e50602c57bb3bf95 Mon Sep 17 00:00:00 2001
|
||||
From: Matt Caswell <matt@openssl.org>
|
||||
Date: Tue, 7 Mar 2023 16:52:55 +0000
|
||||
Subject: [PATCH] Ensure that EXFLAG_INVALID_POLICY is checked even in leaf
|
||||
certs
|
||||
|
||||
Even though we check the leaf cert to confirm it is valid, we
|
||||
later ignored the invalid flag and did not notice that the leaf
|
||||
cert was bad.
|
||||
|
||||
Fixes: CVE-2023-0465
|
||||
|
||||
Reviewed-by: Hugo Landau <hlandau@openssl.org>
|
||||
Reviewed-by: Tomas Mraz <tomas@openssl.org>
|
||||
(Merged from https://github.com/openssl/openssl/pull/20588)
|
||||
|
||||
CVE: CVE-2023-0465
|
||||
Upstream-Status: Backport [https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=b013765abfa80036dc779dd0e50602c57bb3bf95]
|
||||
Comment: Refreshed first hunk
|
||||
Signed-off-by: Omkar Patil <omkar.patil@kpit.com>
|
||||
|
||||
---
|
||||
crypto/x509/x509_vfy.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
|
||||
index 925fbb5412..1dfe4f9f31 100644
|
||||
--- a/crypto/x509/x509_vfy.c
|
||||
+++ b/crypto/x509/x509_vfy.c
|
||||
@@ -1649,18 +1649,25 @@
|
||||
}
|
||||
/* Invalid or inconsistent extensions */
|
||||
if (ret == X509_PCY_TREE_INVALID) {
|
||||
- int i;
|
||||
+ int i, cbcalled = 0;
|
||||
|
||||
/* Locate certificates with bad extensions and notify callback. */
|
||||
- for (i = 1; i < sk_X509_num(ctx->chain); i++) {
|
||||
+ for (i = 0; i < sk_X509_num(ctx->chain); i++) {
|
||||
X509 *x = sk_X509_value(ctx->chain, i);
|
||||
|
||||
if (!(x->ex_flags & EXFLAG_INVALID_POLICY))
|
||||
continue;
|
||||
+ cbcalled = 1;
|
||||
if (!verify_cb_cert(ctx, x, i,
|
||||
X509_V_ERR_INVALID_POLICY_EXTENSION))
|
||||
return 0;
|
||||
}
|
||||
+ if (!cbcalled) {
|
||||
+ /* Should not be able to get here */
|
||||
+ X509err(X509_F_CHECK_POLICY, ERR_R_INTERNAL_ERROR);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ /* The callback ignored the error so we return success */
|
||||
return 1;
|
||||
}
|
||||
if (ret == X509_PCY_TREE_FAILURE) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
From 0d16b7e99aafc0b4a6d729eec65a411a7e025f0a Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Mraz <tomas@openssl.org>
|
||||
Date: Tue, 21 Mar 2023 16:15:47 +0100
|
||||
Subject: [PATCH] Fix documentation of X509_VERIFY_PARAM_add0_policy()
|
||||
|
||||
The function was incorrectly documented as enabling policy checking.
|
||||
|
||||
Fixes: CVE-2023-0466
|
||||
|
||||
Reviewed-by: Matt Caswell <matt@openssl.org>
|
||||
Reviewed-by: Paul Dale <pauli@openssl.org>
|
||||
(Merged from https://github.com/openssl/openssl/pull/20564)
|
||||
|
||||
CVE: CVE-2023-0466
|
||||
Upstream-Status: Backport [https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=0d16b7e99aafc0b4a6d729eec65a411a7e025f0a]
|
||||
Comment: Refreshed first hunk from CHANGE and NEWS
|
||||
Signed-off-by: Omkar Patil <omkar.patil@kpit.com>
|
||||
|
||||
---
|
||||
CHANGES | 5 +++++
|
||||
NEWS | 1 +
|
||||
doc/man3/X509_VERIFY_PARAM_set_flags.pod | 9 +++++++--
|
||||
3 files changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/CHANGES b/CHANGES
|
||||
index efccf7838e..b19f1429bb 100644
|
||||
--- a/CHANGES
|
||||
+++ b/CHANGES
|
||||
@@ -9,6 +9,11 @@
|
||||
|
||||
Changes between 1.1.1s and 1.1.1t [7 Feb 2023]
|
||||
|
||||
+ *) Corrected documentation of X509_VERIFY_PARAM_add0_policy() to mention
|
||||
+ that it does not enable policy checking. Thanks to
|
||||
+ David Benjamin for discovering this issue. (CVE-2023-0466)
|
||||
+ [Tomas Mraz]
|
||||
+
|
||||
*) Fixed X.400 address type confusion in X.509 GeneralName.
|
||||
|
||||
There is a type confusion vulnerability relating to X.400 address processing
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 36a9bb6890..62615693fa 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
Major changes between OpenSSL 1.1.1s and OpenSSL 1.1.1t [7 Feb 2023]
|
||||
|
||||
+ o Fixed documentation of X509_VERIFY_PARAM_add0_policy() (CVE-2023-0466)
|
||||
o Fixed X.400 address type confusion in X.509 GeneralName (CVE-2023-0286)
|
||||
o Fixed Use-after-free following BIO_new_NDEF (CVE-2023-0215)
|
||||
o Fixed Double free after calling PEM_read_bio_ex (CVE-2022-4450)
|
||||
diff --git a/doc/man3/X509_VERIFY_PARAM_set_flags.pod b/doc/man3/X509_VERIFY_PARAM_set_flags.pod
|
||||
index f6f304bf7b..aa292f9336 100644
|
||||
--- a/doc/man3/X509_VERIFY_PARAM_set_flags.pod
|
||||
+++ b/doc/man3/X509_VERIFY_PARAM_set_flags.pod
|
||||
@@ -92,8 +92,9 @@ B<trust>.
|
||||
X509_VERIFY_PARAM_set_time() sets the verification time in B<param> to
|
||||
B<t>. Normally the current time is used.
|
||||
|
||||
-X509_VERIFY_PARAM_add0_policy() enables policy checking (it is disabled
|
||||
-by default) and adds B<policy> to the acceptable policy set.
|
||||
+X509_VERIFY_PARAM_add0_policy() adds B<policy> to the acceptable policy set.
|
||||
+Contrary to preexisting documentation of this function it does not enable
|
||||
+policy checking.
|
||||
|
||||
X509_VERIFY_PARAM_set1_policies() enables policy checking (it is disabled
|
||||
by default) and sets the acceptable policy set to B<policies>. Any existing
|
||||
@@ -377,6 +378,10 @@ and has no effect.
|
||||
|
||||
The X509_VERIFY_PARAM_get_hostflags() function was added in OpenSSL 1.1.0i.
|
||||
|
||||
+The function X509_VERIFY_PARAM_add0_policy() was historically documented as
|
||||
+enabling policy checking however the implementation has never done this.
|
||||
+The documentation was changed to align with the implementation.
|
||||
+
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -18,6 +18,9 @@ SRC_URI = "http://www.openssl.org/source/openssl-${PV}.tar.gz \
|
||||
file://afalg.patch \
|
||||
file://reproducible.patch \
|
||||
file://reproducibility.patch \
|
||||
file://CVE-2023-0464.patch \
|
||||
file://CVE-2023-0465.patch \
|
||||
file://CVE-2023-0466.patch \
|
||||
"
|
||||
|
||||
SRC_URI_append_class-nativesdk = " \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
127.0.0.1 localhost.localdomain localhost
|
||||
127.0.0.1 localhost
|
||||
|
||||
# The following lines are desirable for IPv6 capable hosts
|
||||
::1 localhost ip6-localhost ip6-loopback
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
require glibc-common.inc
|
||||
require glibc-ld.inc
|
||||
|
||||
DEPENDS = "virtual/${TARGET_PREFIX}gcc libgcc-initial linux-libc-headers"
|
||||
DEPENDS = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}binutils${BUSUFFIX} libgcc-initial linux-libc-headers"
|
||||
BUSUFFIX= ""
|
||||
BUSUFFIX:class-nativesdk = "-crosssdk"
|
||||
|
||||
PROVIDES = "virtual/libc"
|
||||
PROVIDES += "virtual/libintl virtual/libiconv"
|
||||
|
||||
@@ -24,7 +24,7 @@ IMAGE_FSTYPES = "wic.vmdk"
|
||||
|
||||
inherit core-image setuptools3
|
||||
|
||||
SRCREV ?= "9fbfbf002e210dbdb2a4b9f3adf8012f245cf38f"
|
||||
SRCREV ?= "ee461b42358db458f39e558b8667fbcffb6d8044"
|
||||
SRC_URI = "git://git.yoctoproject.org/poky;branch=dunfell \
|
||||
file://Yocto_Build_Appliance.vmx \
|
||||
file://Yocto_Build_Appliance.vmxf \
|
||||
|
||||
@@ -66,7 +66,7 @@ create_sdk_files_append () {
|
||||
# Generate new (mini) sdk-environment-setup file
|
||||
script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-${SDK_SYS}}
|
||||
touch $script
|
||||
echo 'export PATH=${SDKPATHNATIVE}${bindir_nativesdk}:${SDKPATHNATIVE}${sbindir_nativesdk}:${SDKPATHNATIVE}${base_bindir_nativesdk}:${SDKPATHNATIVE}${base_sbindir_nativesdk}:$PATH' >> $script
|
||||
echo 'export PATH="${SDKPATHNATIVE}${bindir_nativesdk}:${SDKPATHNATIVE}${sbindir_nativesdk}:${SDKPATHNATIVE}${base_bindir_nativesdk}:${SDKPATHNATIVE}${base_sbindir_nativesdk}:$PATH"' >> $script
|
||||
echo 'export OECORE_NATIVE_SYSROOT="${SDKPATHNATIVE}"' >> $script
|
||||
echo 'export GIT_SSL_CAINFO="${SDKPATHNATIVE}${sysconfdir}/ssl/certs/ca-certificates.crt"' >>$script
|
||||
echo 'export SSL_CERT_FILE="${SDKPATHNATIVE}${sysconfdir}/ssl/certs/ca-certificates.crt"' >>$script
|
||||
|
||||
115
meta/recipes-core/systemd/systemd/CVE-2023-26604-1.patch
Normal file
115
meta/recipes-core/systemd/systemd/CVE-2023-26604-1.patch
Normal file
@@ -0,0 +1,115 @@
|
||||
From 612ebf6c913dd0e4197c44909cb3157f5c51a2f0 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Mon, 31 Aug 2020 19:37:13 +0200
|
||||
Subject: [PATCH] pager: set $LESSSECURE whenver we invoke a pager
|
||||
|
||||
Some extra safety when invoked via "sudo". With this we address a
|
||||
genuine design flaw of sudo, and we shouldn't need to deal with this.
|
||||
But it's still a good idea to disable this surface given how exotic it
|
||||
is.
|
||||
|
||||
Prompted by #5666
|
||||
|
||||
CVE: CVE-2023-26604
|
||||
Upstream-Status: Backport [https://github.com/systemd/systemd/pull/17270/commits/612ebf6c913dd0e4197c44909cb3157f5c51a2f0]
|
||||
Comments: Hunk not refreshed
|
||||
Signed-off-by: rajmohan r <rajmohan.r@kpit.com>
|
||||
---
|
||||
man/less-variables.xml | 9 +++++++++
|
||||
man/systemctl.xml | 1 +
|
||||
man/systemd.xml | 1 +
|
||||
src/shared/pager.c | 23 +++++++++++++++++++++--
|
||||
4 files changed, 32 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/man/less-variables.xml b/man/less-variables.xml
|
||||
index 08e513c99f8e..c52511ca8e18 100644
|
||||
--- a/man/less-variables.xml
|
||||
+++ b/man/less-variables.xml
|
||||
@@ -64,6 +64,15 @@
|
||||
the invoking terminal is determined to be UTF-8 compatible).</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
+ <varlistentry id='lesssecure'>
|
||||
+ <term><varname>$SYSTEMD_LESSSECURE</varname></term>
|
||||
+
|
||||
+ <listitem><para>Takes a boolean argument. Overrides the <varname>$LESSSECURE</varname> environment
|
||||
+ variable when invoking the pager, which controls the "secure" mode of less (which disables commands
|
||||
+ such as <literal>|</literal> which allow to easily shell out to external command lines). By default
|
||||
+ less secure mode is enabled, with this setting it may be disabled.</para></listitem>
|
||||
+ </varlistentry>
|
||||
+
|
||||
<varlistentry id='colors'>
|
||||
<term><varname>$SYSTEMD_COLORS</varname></term>
|
||||
|
||||
diff --git a/man/systemctl.xml b/man/systemctl.xml
|
||||
index 1c5502883700..a3f0c3041a57 100644
|
||||
--- a/man/systemctl.xml
|
||||
+++ b/man/systemctl.xml
|
||||
@@ -2240,6 +2240,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
|
||||
<xi:include href="less-variables.xml" xpointer="pager"/>
|
||||
<xi:include href="less-variables.xml" xpointer="less"/>
|
||||
<xi:include href="less-variables.xml" xpointer="lesscharset"/>
|
||||
+ <xi:include href="less-variables.xml" xpointer="lesssecure"/>
|
||||
<xi:include href="less-variables.xml" xpointer="colors"/>
|
||||
<xi:include href="less-variables.xml" xpointer="urlify"/>
|
||||
</refsect1>
|
||||
diff --git a/man/systemd.xml b/man/systemd.xml
|
||||
index a9040545c2ab..c92cfef77689 100644
|
||||
--- a/man/systemd.xml
|
||||
+++ b/man/systemd.xml
|
||||
@@ -692,6 +692,7 @@
|
||||
<xi:include href="less-variables.xml" xpointer="pager"/>
|
||||
<xi:include href="less-variables.xml" xpointer="less"/>
|
||||
<xi:include href="less-variables.xml" xpointer="lesscharset"/>
|
||||
+ <xi:include href="less-variables.xml" xpointer="lesssecure"/>
|
||||
<xi:include href="less-variables.xml" xpointer="colors"/>
|
||||
<xi:include href="less-variables.xml" xpointer="urlify"/>
|
||||
|
||||
diff --git a/src/shared/pager.c b/src/shared/pager.c
|
||||
index e03be6d23b2d..9c21881241f5 100644
|
||||
--- a/src/shared/pager.c
|
||||
+++ b/src/shared/pager.c
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include "copy.h"
|
||||
+#include "env-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "io-util.h"
|
||||
@@ -152,8 +153,7 @@ int pager_open(PagerFlags flags) {
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
- /* Initialize a good charset for less. This is
|
||||
- * particularly important if we output UTF-8
|
||||
+ /* Initialize a good charset for less. This is particularly important if we output UTF-8
|
||||
* characters. */
|
||||
less_charset = getenv("SYSTEMD_LESSCHARSET");
|
||||
if (!less_charset && is_locale_utf8())
|
||||
@@ -164,6 +164,25 @@ int pager_open(PagerFlags flags) {
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
+ /* People might invoke us from sudo, don't needlessly allow less to be a way to shell out
|
||||
+ * privileged stuff. */
|
||||
+ r = getenv_bool("SYSTEMD_LESSSECURE");
|
||||
+ if (r == 0) { /* Remove env var if off */
|
||||
+ if (unsetenv("LESSSECURE") < 0) {
|
||||
+ log_error_errno(errno, "Failed to uset environment variable LESSSECURE: %m");
|
||||
+ _exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ } else {
|
||||
+ /* Set env var otherwise */
|
||||
+ if (r < 0)
|
||||
+ log_warning_errno(r, "Unable to parse $SYSTEMD_LESSSECURE, ignoring: %m");
|
||||
+
|
||||
+ if (setenv("LESSSECURE", "1", 1) < 0) {
|
||||
+ log_error_errno(errno, "Failed to set environment variable LESSSECURE: %m");
|
||||
+ _exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (pager_args) {
|
||||
r = loop_write(exe_name_pipe[1], pager_args[0], strlen(pager_args[0]) + 1, false);
|
||||
if (r < 0) {
|
||||
264
meta/recipes-core/systemd/systemd/CVE-2023-26604-2.patch
Normal file
264
meta/recipes-core/systemd/systemd/CVE-2023-26604-2.patch
Normal file
@@ -0,0 +1,264 @@
|
||||
From 1b5b507cd2d1d7a2b053151abb548475ad9c5c3b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Mon, 12 Oct 2020 18:57:32 +0200
|
||||
Subject: [PATCH] test-login: always test sd_pid_get_owner_uid(), modernize
|
||||
|
||||
A long time some function only worked when in a session, and the test
|
||||
didn't execute them when sd_pid_get_session() failed. Let's always call
|
||||
them to increase coverage.
|
||||
|
||||
While at it, let's test for ==0 not >=0 where we don't expect the function
|
||||
to return anything except 0 or error.
|
||||
|
||||
CVE: CVE-2023-26604
|
||||
Upstream-Status: Backport [https://github.com/systemd/systemd/pull/17270/commits/1b5b507cd2d1d7a2b053151abb548475ad9c5c3b.patch]
|
||||
Comments: Hunk not refreshed
|
||||
Signed-off-by: rajmohan r <rajmohan.r@kpit.com>
|
||||
---
|
||||
src/libsystemd/sd-login/test-login.c | 131 ++++++++++++++-------------
|
||||
1 file changed, 70 insertions(+), 61 deletions(-)
|
||||
|
||||
diff --git a/src/libsystemd/sd-login/test-login.c b/src/libsystemd/sd-login/test-login.c
|
||||
index c0c77e04714b..0494fc77ba18 100644
|
||||
--- a/src/libsystemd/sd-login/test-login.c
|
||||
+++ b/src/libsystemd/sd-login/test-login.c
|
||||
@@ -5,21 +5,22 @@
|
||||
#include "sd-login.h"
|
||||
|
||||
#include "alloc-util.h"
|
||||
+#include "errno-list.h"
|
||||
#include "fd-util.h"
|
||||
#include "format-util.h"
|
||||
#include "log.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "time-util.h"
|
||||
-#include "util.h"
|
||||
+#include "user-util.h"
|
||||
|
||||
static char* format_uids(char **buf, uid_t* uids, int count) {
|
||||
- int pos = 0, k, inc;
|
||||
+ int pos = 0, inc;
|
||||
size_t size = (DECIMAL_STR_MAX(uid_t) + 1) * count + 1;
|
||||
|
||||
assert_se(*buf = malloc(size));
|
||||
|
||||
- for (k = 0; k < count; k++) {
|
||||
+ for (int k = 0; k < count; k++) {
|
||||
sprintf(*buf + pos, "%s"UID_FMT"%n", k > 0 ? " " : "", uids[k], &inc);
|
||||
pos += inc;
|
||||
}
|
||||
@@ -30,6 +31,10 @@ static char* format_uids(char **buf, uid_t* uids, int count) {
|
||||
return *buf;
|
||||
}
|
||||
|
||||
+static const char *e(int r) {
|
||||
+ return r == 0 ? "OK" : errno_to_name(r);
|
||||
+}
|
||||
+
|
||||
static void test_login(void) {
|
||||
_cleanup_close_pair_ int pair[2] = { -1, -1 };
|
||||
_cleanup_free_ char *pp = NULL, *qq = NULL,
|
||||
@@ -39,65 +44,71 @@ static void test_login(void) {
|
||||
*seat = NULL, *session = NULL,
|
||||
*unit = NULL, *user_unit = NULL, *slice = NULL;
|
||||
int r;
|
||||
- uid_t u, u2;
|
||||
- char *t, **seats, **sessions;
|
||||
+ uid_t u, u2 = UID_INVALID;
|
||||
+ char *t, **seats = NULL, **sessions = NULL;
|
||||
|
||||
r = sd_pid_get_unit(0, &unit);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
- log_info("sd_pid_get_unit(0, …) → \"%s\"", strna(unit));
|
||||
+ log_info("sd_pid_get_unit(0, …) → %s / \"%s\"", e(r), strnull(unit));
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
|
||||
r = sd_pid_get_user_unit(0, &user_unit);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
- log_info("sd_pid_get_user_unit(0, …) → \"%s\"", strna(user_unit));
|
||||
+ log_info("sd_pid_get_user_unit(0, …) → %s / \"%s\"", e(r), strnull(user_unit));
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
|
||||
r = sd_pid_get_slice(0, &slice);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
- log_info("sd_pid_get_slice(0, …) → \"%s\"", strna(slice));
|
||||
+ log_info("sd_pid_get_slice(0, …) → %s / \"%s\"", e(r), strnull(slice));
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
+
|
||||
+ r = sd_pid_get_owner_uid(0, &u2);
|
||||
+ log_info("sd_pid_get_owner_uid(0, …) → %s / "UID_FMT, e(r), u2);
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
|
||||
r = sd_pid_get_session(0, &session);
|
||||
- if (r < 0) {
|
||||
- log_warning_errno(r, "sd_pid_get_session(0, …): %m");
|
||||
- if (r == -ENODATA)
|
||||
- log_info("Seems we are not running in a session, skipping some tests.");
|
||||
- } else {
|
||||
- log_info("sd_pid_get_session(0, …) → \"%s\"", session);
|
||||
-
|
||||
- assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
|
||||
- log_info("sd_pid_get_owner_uid(0, …) → "UID_FMT, u2);
|
||||
-
|
||||
- assert_se(sd_pid_get_cgroup(0, &cgroup) == 0);
|
||||
- log_info("sd_pid_get_cgroup(0, …) → \"%s\"", cgroup);
|
||||
-
|
||||
- r = sd_uid_get_display(u2, &display_session);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
- log_info("sd_uid_get_display("UID_FMT", …) → \"%s\"",
|
||||
- u2, strnull(display_session));
|
||||
-
|
||||
- assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
|
||||
- sd_peer_get_session(pair[0], &pp);
|
||||
- sd_peer_get_session(pair[1], &qq);
|
||||
- assert_se(streq_ptr(pp, qq));
|
||||
-
|
||||
- r = sd_uid_get_sessions(u2, false, &sessions);
|
||||
+ log_info("sd_pid_get_session(0, …) → %s / \"%s\"", e(r), strnull(session));
|
||||
+
|
||||
+ r = sd_pid_get_cgroup(0, &cgroup);
|
||||
+ log_info("sd_pid_get_cgroup(0, …) → %s / \"%s\"", e(r), strnull(cgroup));
|
||||
+ assert_se(r == 0);
|
||||
+
|
||||
+ r = sd_uid_get_display(u2, &display_session);
|
||||
+ log_info("sd_uid_get_display("UID_FMT", …) → %s / \"%s\"", u2, e(r), strnull(display_session));
|
||||
+ if (u2 == UID_INVALID)
|
||||
+ assert_se(r == -EINVAL);
|
||||
+ else
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
+
|
||||
+ assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
|
||||
+ sd_peer_get_session(pair[0], &pp);
|
||||
+ sd_peer_get_session(pair[1], &qq);
|
||||
+ assert_se(streq_ptr(pp, qq));
|
||||
+
|
||||
+ r = sd_uid_get_sessions(u2, false, &sessions);
|
||||
+ assert_se(t = strv_join(sessions, " "));
|
||||
+ log_info("sd_uid_get_sessions("UID_FMT", …) → %s \"%s\"", u2, e(r), t);
|
||||
+ if (u2 == UID_INVALID)
|
||||
+ assert_se(r == -EINVAL);
|
||||
+ else {
|
||||
assert_se(r >= 0);
|
||||
assert_se(r == (int) strv_length(sessions));
|
||||
- assert_se(t = strv_join(sessions, " "));
|
||||
- strv_free(sessions);
|
||||
- log_info("sd_uid_get_sessions("UID_FMT", …) → [%i] \"%s\"", u2, r, t);
|
||||
- free(t);
|
||||
+ }
|
||||
+ sessions = strv_free(sessions);
|
||||
+ free(t);
|
||||
|
||||
- assert_se(r == sd_uid_get_sessions(u2, false, NULL));
|
||||
+ assert_se(r == sd_uid_get_sessions(u2, false, NULL));
|
||||
|
||||
- r = sd_uid_get_seats(u2, false, &seats);
|
||||
+ r = sd_uid_get_seats(u2, false, &seats);
|
||||
+ assert_se(t = strv_join(seats, " "));
|
||||
+ log_info("sd_uid_get_seats("UID_FMT", …) → %s \"%s\"", u2, e(r), t);
|
||||
+ if (u2 == UID_INVALID)
|
||||
+ assert_se(r == -EINVAL);
|
||||
+ else {
|
||||
assert_se(r >= 0);
|
||||
assert_se(r == (int) strv_length(seats));
|
||||
- assert_se(t = strv_join(seats, " "));
|
||||
- strv_free(seats);
|
||||
- log_info("sd_uid_get_seats("UID_FMT", …) → [%i] \"%s\"", u2, r, t);
|
||||
- free(t);
|
||||
-
|
||||
- assert_se(r == sd_uid_get_seats(u2, false, NULL));
|
||||
}
|
||||
+ seats = strv_free(seats);
|
||||
+ free(t);
|
||||
+
|
||||
+ assert_se(r == sd_uid_get_seats(u2, false, NULL));
|
||||
|
||||
if (session) {
|
||||
r = sd_session_is_active(session);
|
||||
@@ -109,7 +120,7 @@ static void test_login(void) {
|
||||
log_info("sd_session_is_remote(\"%s\") → %s", session, yes_no(r));
|
||||
|
||||
r = sd_session_get_state(session, &state);
|
||||
- assert_se(r >= 0);
|
||||
+ assert_se(r == 0);
|
||||
log_info("sd_session_get_state(\"%s\") → \"%s\"", session, state);
|
||||
|
||||
assert_se(sd_session_get_uid(session, &u) >= 0);
|
||||
@@ -123,16 +134,16 @@ static void test_login(void) {
|
||||
log_info("sd_session_get_class(\"%s\") → \"%s\"", session, class);
|
||||
|
||||
r = sd_session_get_display(session, &display);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
log_info("sd_session_get_display(\"%s\") → \"%s\"", session, strna(display));
|
||||
|
||||
r = sd_session_get_remote_user(session, &remote_user);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
log_info("sd_session_get_remote_user(\"%s\") → \"%s\"",
|
||||
session, strna(remote_user));
|
||||
|
||||
r = sd_session_get_remote_host(session, &remote_host);
|
||||
- assert_se(r >= 0 || r == -ENODATA);
|
||||
+ assert_se(IN_SET(r, 0, -ENODATA));
|
||||
log_info("sd_session_get_remote_host(\"%s\") → \"%s\"",
|
||||
session, strna(remote_host));
|
||||
|
||||
@@ -161,7 +172,7 @@ static void test_login(void) {
|
||||
assert_se(r == -ENODATA);
|
||||
}
|
||||
|
||||
- assert_se(sd_uid_get_state(u, &state2) >= 0);
|
||||
+ assert_se(sd_uid_get_state(u, &state2) == 0);
|
||||
log_info("sd_uid_get_state("UID_FMT", …) → %s", u, state2);
|
||||
}
|
||||
|
||||
@@ -173,11 +184,11 @@ static void test_login(void) {
|
||||
assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
|
||||
|
||||
r = sd_seat_get_active(seat, &session2, &u2);
|
||||
- assert_se(r >= 0);
|
||||
+ assert_se(r == 0);
|
||||
log_info("sd_seat_get_active(\"%s\", …) → \"%s\", "UID_FMT, seat, session2, u2);
|
||||
|
||||
r = sd_uid_is_on_seat(u, 1, seat);
|
||||
- assert_se(r >= 0);
|
||||
+ assert_se(IN_SET(r, 0, 1));
|
||||
assert_se(!!r == streq(session, session2));
|
||||
|
||||
r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
|
||||
@@ -185,8 +196,8 @@ static void test_login(void) {
|
||||
assert_se(r == (int) strv_length(sessions));
|
||||
assert_se(t = strv_join(sessions, " "));
|
||||
strv_free(sessions);
|
||||
- log_info("sd_seat_get_sessions(\"%s\", …) → %i, \"%s\", [%i] {%s}",
|
||||
- seat, r, t, n, format_uids(&buf, uids, n));
|
||||
+ log_info("sd_seat_get_sessions(\"%s\", …) → %s, \"%s\", [%u] {%s}",
|
||||
+ seat, e(r), t, n, format_uids(&buf, uids, n));
|
||||
free(t);
|
||||
|
||||
assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
|
||||
@@ -204,7 +215,7 @@ static void test_login(void) {
|
||||
|
||||
r = sd_seat_get_active(NULL, &t, NULL);
|
||||
assert_se(IN_SET(r, 0, -ENODATA));
|
||||
- log_info("sd_seat_get_active(NULL, …) (active session on current seat) → %s", strnull(t));
|
||||
+ log_info("sd_seat_get_active(NULL, …) (active session on current seat) → %s / \"%s\"", e(r), strnull(t));
|
||||
free(t);
|
||||
|
||||
r = sd_get_sessions(&sessions);
|
||||
@@ -244,13 +255,11 @@ static void test_login(void) {
|
||||
|
||||
static void test_monitor(void) {
|
||||
sd_login_monitor *m = NULL;
|
||||
- unsigned n;
|
||||
int r;
|
||||
|
||||
- r = sd_login_monitor_new("session", &m);
|
||||
- assert_se(r >= 0);
|
||||
+ assert_se(sd_login_monitor_new("session", &m) == 0);
|
||||
|
||||
- for (n = 0; n < 5; n++) {
|
||||
+ for (unsigned n = 0; n < 5; n++) {
|
||||
struct pollfd pollfd = {};
|
||||
usec_t timeout, nw;
|
||||
182
meta/recipes-core/systemd/systemd/CVE-2023-26604-3.patch
Normal file
182
meta/recipes-core/systemd/systemd/CVE-2023-26604-3.patch
Normal file
@@ -0,0 +1,182 @@
|
||||
From 0a42426d797406b4b01a0d9c13bb759c2629d108 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Wed, 7 Oct 2020 11:15:05 +0200
|
||||
Subject: [PATCH] pager: make pager secure when under euid is changed or
|
||||
explicitly requested
|
||||
|
||||
The variable is renamed to SYSTEMD_PAGERSECURE (because it's not just about
|
||||
less now), and we automatically enable secure mode in certain cases, but not
|
||||
otherwise.
|
||||
|
||||
This approach is more nuanced, but should provide a better experience for
|
||||
users:
|
||||
|
||||
- Previusly we would set LESSSECURE=1 and trust the pager to make use of
|
||||
it. But this has an effect only on less. We need to not start pagers which
|
||||
are insecure when in secure mode. In particular more is like that and is a
|
||||
very popular pager.
|
||||
|
||||
- We don't enable secure mode always, which means that those other pagers can
|
||||
reasonably used.
|
||||
|
||||
- We do the right thing by default, but the user has ultimate control by
|
||||
setting SYSTEMD_PAGERSECURE.
|
||||
|
||||
Fixes #5666.
|
||||
|
||||
v2:
|
||||
- also check $PKEXEC_UID
|
||||
|
||||
v3:
|
||||
- use 'sd_pid_get_owner_uid() != geteuid()' as the condition
|
||||
|
||||
CVE: CVE-2023-26604
|
||||
Upstream-Status: Backport [https://github.com/systemd/systemd/pull/17270/commits/0a42426d797406b4b01a0d9c13bb759c2629d108]
|
||||
Comments: Hunk refreshed
|
||||
Signed-off-by: rajmohan r <rajmohan.r@kpit.com>
|
||||
---
|
||||
man/less-variables.xml | 30 +++++++++++++++----
|
||||
src/shared/pager.c | 63 ++++++++++++++++++++++++++-------------
|
||||
2 files changed, 66 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/man/less-variables.xml b/man/less-variables.xml
|
||||
index c52511c..049e9f7 100644
|
||||
--- a/man/less-variables.xml
|
||||
+++ b/man/less-variables.xml
|
||||
@@ -65,12 +65,30 @@
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id='lesssecure'>
|
||||
- <term><varname>$SYSTEMD_LESSSECURE</varname></term>
|
||||
-
|
||||
- <listitem><para>Takes a boolean argument. Overrides the <varname>$LESSSECURE</varname> environment
|
||||
- variable when invoking the pager, which controls the "secure" mode of less (which disables commands
|
||||
- such as <literal>|</literal> which allow to easily shell out to external command lines). By default
|
||||
- less secure mode is enabled, with this setting it may be disabled.</para></listitem>
|
||||
+ <term><varname>$SYSTEMD_PAGERSECURE</varname></term>
|
||||
+
|
||||
+ <listitem><para>Takes a boolean argument. When true, the "secure" mode of the pager is enabled; if
|
||||
+ false, disabled. If <varname>$SYSTEMD_PAGERSECURE</varname> is not set at all, secure mode is enabled
|
||||
+ if the effective UID is not the same as the owner of the login session, see <citerefentry
|
||||
+ project='man-pages'><refentrytitle>geteuid</refentrytitle><manvolnum>2</manvolnum></citerefentry> and
|
||||
+ <citerefentry><refentrytitle>sd_pid_get_owner_uid</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
|
||||
+ In secure mode, <option>LESSSECURE=1</option> will be set when invoking the pager, and the pager shall
|
||||
+ disable commands that open or create new files or start new subprocesses. When
|
||||
+ <varname>$SYSTEMD_PAGERSECURE</varname> is not set at all, pagers which are not known to implement
|
||||
+ secure mode will not be used. (Currently only
|
||||
+ <citerefentry><refentrytitle>less</refentrytitle><manvolnum>1</manvolnum></citerefentry> implements
|
||||
+ secure mode.)</para>
|
||||
+
|
||||
+ <para>Note: when commands are invoked with elevated privileges, for example under <citerefentry
|
||||
+ project='man-pages'><refentrytitle>sudo</refentrytitle><manvolnum>8</manvolnum></citerefentry> or
|
||||
+ <citerefentry
|
||||
+ project='die-net'><refentrytitle>pkexec</refentrytitle><manvolnum>1</manvolnum></citerefentry>, care
|
||||
+ must be taken to ensure that unintended interactive features are not enabled. "Secure" mode for the
|
||||
+ pager may be enabled automatically as describe above. Setting <varname>SYSTEMD_PAGERSECURE=0</varname>
|
||||
+ or not removing it from the inherited environment allows the user to invoke arbitrary commands. Note
|
||||
+ that if the <varname>$SYSTEMD_PAGER</varname> or <varname>$PAGER</varname> variables are to be
|
||||
+ honoured, <varname>$SYSTEMD_PAGERSECURE</varname> must be set too. It might be reasonable to completly
|
||||
+ disable the pager using <option>--no-pager</option> instead.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id='colors'>
|
||||
diff --git a/src/shared/pager.c b/src/shared/pager.c
|
||||
index a3b6576..a72d9ea 100644
|
||||
--- a/src/shared/pager.c
|
||||
+++ b/src/shared/pager.c
|
||||
@@ -8,6 +8,8 @@
|
||||
#include <sys/prctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
+#include "sd-login.h"
|
||||
+
|
||||
#include "copy.h"
|
||||
#include "env-util.h"
|
||||
#include "fd-util.h"
|
||||
@@ -164,25 +166,42 @@ int pager_open(PagerFlags flags) {
|
||||
}
|
||||
|
||||
/* People might invoke us from sudo, don't needlessly allow less to be a way to shell out
|
||||
- * privileged stuff. */
|
||||
- r = getenv_bool("SYSTEMD_LESSSECURE");
|
||||
- if (r == 0) { /* Remove env var if off */
|
||||
- if (unsetenv("LESSSECURE") < 0) {
|
||||
- log_error_errno(errno, "Failed to uset environment variable LESSSECURE: %m");
|
||||
- _exit(EXIT_FAILURE);
|
||||
- }
|
||||
- } else {
|
||||
- /* Set env var otherwise */
|
||||
+ * privileged stuff. If the user set $SYSTEMD_PAGERSECURE, trust their configuration of the
|
||||
+ * pager. If they didn't, use secure mode when under euid is changed. If $SYSTEMD_PAGERSECURE
|
||||
+ * wasn't explicitly set, and we autodetect the need for secure mode, only use the pager we
|
||||
+ * know to be good. */
|
||||
+ int use_secure_mode = getenv_bool("SYSTEMD_PAGERSECURE");
|
||||
+ bool trust_pager = use_secure_mode >= 0;
|
||||
+ if (use_secure_mode == -ENXIO) {
|
||||
+ uid_t uid;
|
||||
+
|
||||
+ r = sd_pid_get_owner_uid(0, &uid);
|
||||
if (r < 0)
|
||||
- log_warning_errno(r, "Unable to parse $SYSTEMD_LESSSECURE, ignoring: %m");
|
||||
+ log_debug_errno(r, "sd_pid_get_owner_uid() failed, enabling pager secure mode: %m");
|
||||
|
||||
- if (setenv("LESSSECURE", "1", 1) < 0) {
|
||||
- log_error_errno(errno, "Failed to set environment variable LESSSECURE: %m");
|
||||
- _exit(EXIT_FAILURE);
|
||||
- }
|
||||
+ use_secure_mode = r < 0 || uid != geteuid();
|
||||
+
|
||||
+ } else if (use_secure_mode < 0) {
|
||||
+ log_warning_errno(use_secure_mode, "Unable to parse $SYSTEMD_PAGERSECURE, assuming true: %m");
|
||||
+ use_secure_mode = true;
|
||||
}
|
||||
|
||||
- if (pager_args) {
|
||||
+ /* We generally always set variables used by less, even if we end up using a different pager.
|
||||
+ * They shouldn't hurt in any case, and ideally other pagers would look at them too. */
|
||||
+ if (use_secure_mode)
|
||||
+ r = setenv("LESSSECURE", "1", 1);
|
||||
+ else
|
||||
+ r = unsetenv("LESSSECURE");
|
||||
+ if (r < 0) {
|
||||
+ log_error_errno(errno, "Failed to adjust environment variable LESSSECURE: %m");
|
||||
+ _exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ if (trust_pager && pager_args) { /* The pager config might be set globally, and we cannot
|
||||
+ * know if the user adjusted it to be appropriate for the
|
||||
+ * secure mode. Thus, start the pager specified through
|
||||
+ * envvars only when $SYSTEMD_PAGERSECURE was explicitly set
|
||||
+ * as well. */
|
||||
r = loop_write(exe_name_pipe[1], pager_args[0], strlen(pager_args[0]) + 1, false);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to write pager name to socket: %m");
|
||||
@@ -194,13 +213,14 @@ int pager_open(PagerFlags flags) {
|
||||
"Failed to execute '%s', using fallback pagers: %m", pager_args[0]);
|
||||
}
|
||||
|
||||
- /* Debian's alternatives command for pagers is
|
||||
- * called 'pager'. Note that we do not call
|
||||
- * sensible-pagers here, since that is just a
|
||||
- * shell script that implements a logic that
|
||||
- * is similar to this one anyway, but is
|
||||
- * Debian-specific. */
|
||||
+ /* Debian's alternatives command for pagers is called 'pager'. Note that we do not call
|
||||
+ * sensible-pagers here, since that is just a shell script that implements a logic that is
|
||||
+ * similar to this one anyway, but is Debian-specific. */
|
||||
FOREACH_STRING(exe, "pager", "less", "more") {
|
||||
+ /* Only less implements secure mode right now. */
|
||||
+ if (use_secure_mode && !streq(exe, "less"))
|
||||
+ continue;
|
||||
+
|
||||
r = loop_write(exe_name_pipe[1], exe, strlen(exe) + 1, false);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to write pager name to socket: %m");
|
||||
@@ -211,6 +231,7 @@ int pager_open(PagerFlags flags) {
|
||||
"Failed to execute '%s', using next fallback pager: %m", exe);
|
||||
}
|
||||
|
||||
+ /* Our builtin is also very secure. */
|
||||
r = loop_write(exe_name_pipe[1], "(built-in)", strlen("(built-in)") + 1, false);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to write pager name to socket: %m");
|
||||
32
meta/recipes-core/systemd/systemd/CVE-2023-26604-4.patch
Normal file
32
meta/recipes-core/systemd/systemd/CVE-2023-26604-4.patch
Normal file
@@ -0,0 +1,32 @@
|
||||
From b8f736b30e20a2b44e7c34bb4e43b0d97ae77e3c Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Thu, 15 Oct 2020 10:54:48 +0200
|
||||
Subject: [PATCH] pager: lets check SYSTEMD_PAGERSECURE with secure_getenv()
|
||||
|
||||
I can't think of any real vulnerability about this, but it still feels
|
||||
better to check a variable with "secure" in its name with
|
||||
secure_getenv() rather than plain getenv().
|
||||
|
||||
Paranoia FTW!
|
||||
|
||||
CVE: CVE-2023-26604
|
||||
Upstream-Status: Backport [https://github.com/systemd/systemd/pull/17359/commits/b8f736b30e20a2b44e7c34bb4e43b0d97ae77e3c]
|
||||
Comments: Hunk refreshed
|
||||
Signed-off-by: rajmohan r <rajmohan.r@kpit.com>
|
||||
---
|
||||
src/shared/pager.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shared/pager.c b/src/shared/pager.c
|
||||
index a72d9ea..250519c 100644
|
||||
--- a/src/shared/pager.c
|
||||
+++ b/src/shared/pager.c
|
||||
@@ -170,7 +170,7 @@ int pager_open(PagerFlags flags) {
|
||||
* pager. If they didn't, use secure mode when under euid is changed. If $SYSTEMD_PAGERSECURE
|
||||
* wasn't explicitly set, and we autodetect the need for secure mode, only use the pager we
|
||||
* know to be good. */
|
||||
- int use_secure_mode = getenv_bool("SYSTEMD_PAGERSECURE");
|
||||
+ int use_secure_mode = getenv_bool_secure("SYSTEMD_PAGERSECURE");
|
||||
bool trust_pager = use_secure_mode >= 0;
|
||||
if (use_secure_mode == -ENXIO) {
|
||||
uid_t uid;
|
||||
7
meta/recipes-core/systemd/systemd/systemd-pager.sh
Normal file
7
meta/recipes-core/systemd/systemd/systemd-pager.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
# Systemd expect a color capable pager, however the less provided
|
||||
# by busybox is not. This make many interaction with systemd pretty
|
||||
# annoying. As a workaround we disable the systemd pager if less
|
||||
# is not the GNU version.
|
||||
if ! less -V > /dev/null 2>&1 ; then
|
||||
export SYSTEMD_PAGER=
|
||||
fi
|
||||
@@ -18,6 +18,7 @@ SRC_URI += "file://touchscreen.rules \
|
||||
file://00-create-volatile.conf \
|
||||
file://init \
|
||||
file://99-default.preset \
|
||||
file://systemd-pager.sh \
|
||||
file://0001-binfmt-Don-t-install-dependency-links-at-install-tim.patch \
|
||||
file://0003-implment-systemd-sysv-install-for-OE.patch \
|
||||
file://CVE-2021-33910.patch \
|
||||
@@ -34,6 +35,10 @@ SRC_URI += "file://touchscreen.rules \
|
||||
file://CVE-2021-3997-2.patch \
|
||||
file://CVE-2021-3997-3.patch \
|
||||
file://CVE-2022-3821.patch \
|
||||
file://CVE-2023-26604-1.patch \
|
||||
file://CVE-2023-26604-2.patch \
|
||||
file://CVE-2023-26604-3.patch \
|
||||
file://CVE-2023-26604-4.patch \
|
||||
"
|
||||
|
||||
# patches needed by musl
|
||||
@@ -214,7 +219,7 @@ rootlibexecdir = "${rootprefix}/lib"
|
||||
EXTRA_OEMESON += "-Dlink-udev-shared=false"
|
||||
|
||||
EXTRA_OEMESON += "-Dnobody-user=nobody \
|
||||
-Dnobody-group=nobody \
|
||||
-Dnobody-group=nogroup \
|
||||
-Drootlibdir=${rootlibdir} \
|
||||
-Drootprefix=${rootprefix} \
|
||||
-Ddefault-locale=C \
|
||||
@@ -317,6 +322,9 @@ do_install() {
|
||||
# install default policy for presets
|
||||
# https://www.freedesktop.org/wiki/Software/systemd/Preset/#howto
|
||||
install -Dm 0644 ${WORKDIR}/99-default.preset ${D}${systemd_unitdir}/system-preset/99-default.preset
|
||||
|
||||
# add a profile fragment to disable systemd pager with busybox less
|
||||
install -Dm 0644 ${WORKDIR}/systemd-pager.sh ${D}${sysconfdir}/profile.d/systemd-pager.sh
|
||||
}
|
||||
|
||||
python populate_packages_prepend (){
|
||||
@@ -539,6 +547,7 @@ FILES_${PN} = " ${base_bindir}/* \
|
||||
${sysconfdir}/dbus-1/ \
|
||||
${sysconfdir}/modules-load.d/ \
|
||||
${sysconfdir}/pam.d/ \
|
||||
${sysconfdir}/profile.d/ \
|
||||
${sysconfdir}/sysctl.d/ \
|
||||
${sysconfdir}/systemd/ \
|
||||
${sysconfdir}/tmpfiles.d/ \
|
||||
|
||||
179
meta/recipes-devtools/git/files/CVE-2023-22490-1.patch
Normal file
179
meta/recipes-devtools/git/files/CVE-2023-22490-1.patch
Normal file
@@ -0,0 +1,179 @@
|
||||
From 58325b93c5b6212697b088371809e9948fee8052 Mon Sep 17 00:00:00 2001
|
||||
From: Taylor Blau <me@ttaylorr.com>
|
||||
Date: Tue, 24 Jan 2023 19:43:45 -0500
|
||||
Subject: [PATCH 1/3] t5619: demonstrate clone_local() with ambiguous transport
|
||||
|
||||
When cloning a repository, Git must determine (a) what transport
|
||||
mechanism to use, and (b) whether or not the clone is local.
|
||||
|
||||
Since f38aa83 (use local cloning if insteadOf makes a local URL,
|
||||
2014-07-17), the latter check happens after the remote has been
|
||||
initialized, and references the remote's URL instead of the local path.
|
||||
This is done to make it possible for a `url.<base>.insteadOf` rule to
|
||||
convert a remote URL into a local one, in which case the `clone_local()`
|
||||
mechanism should be used.
|
||||
|
||||
However, with a specially crafted repository, Git can be tricked into
|
||||
using a non-local transport while still setting `is_local` to "1" and
|
||||
using the `clone_local()` optimization. The below test case
|
||||
demonstrates such an instance, and shows that it can be used to include
|
||||
arbitrary (known) paths in the working copy of a cloned repository on a
|
||||
victim's machine[^1], even if local file clones are forbidden by
|
||||
`protocol.file.allow`.
|
||||
|
||||
This happens in a few parts:
|
||||
|
||||
1. We first call `get_repo_path()` to see if the remote is a local
|
||||
path. If it is, we replace the repo name with its absolute path.
|
||||
|
||||
2. We then call `transport_get()` on the repo name and decide how to
|
||||
access it. If it was turned into an absolute path in the previous
|
||||
step, then we should always treat it like a file.
|
||||
|
||||
3. We use `get_repo_path()` again, and set `is_local` as appropriate.
|
||||
But it's already too late to rewrite the repo name as an absolute
|
||||
path, since we've already fed it to the transport code.
|
||||
|
||||
The attack works by including a submodule whose URL corresponds to a
|
||||
path on disk. In the below example, the repository "sub" is reachable
|
||||
via the dumb HTTP protocol at (something like):
|
||||
|
||||
http://127.0.0.1:NNNN/dumb/sub.git
|
||||
|
||||
However, the path "http:/127.0.0.1:NNNN/dumb" (that is, a top-level
|
||||
directory called "http:", then nested directories "127.0.0.1:NNNN", and
|
||||
"dumb") exists within the repository, too.
|
||||
|
||||
To determine this, it first picks the appropriate transport, which is
|
||||
dumb HTTP. It then uses the remote's URL in order to determine whether
|
||||
the repository exists locally on disk. However, the malicious repository
|
||||
also contains an embedded stub repository which is the target of a
|
||||
symbolic link at the local path corresponding to the "sub" repository on
|
||||
disk (i.e., there is a symbolic link at "http:/127.0.0.1/dumb/sub.git",
|
||||
pointing to the stub repository via ".git/modules/sub/../../../repo").
|
||||
|
||||
This stub repository fools Git into thinking that a local repository
|
||||
exists at that URL and thus can be cloned locally. The affected call is
|
||||
in `get_repo_path()`, which in turn calls `get_repo_path_1()`, which
|
||||
locates a valid repository at that target.
|
||||
|
||||
This then causes Git to set the `is_local` variable to "1", and in turn
|
||||
instructs Git to clone the repository using its local clone optimization
|
||||
via the `clone_local()` function.
|
||||
|
||||
The exploit comes into play because the stub repository's top-level
|
||||
"$GIT_DIR/objects" directory is a symbolic link which can point to an
|
||||
arbitrary path on the victim's machine. `clone_local()` resolves the
|
||||
top-level "objects" directory through a `stat(2)` call, meaning that we
|
||||
read through the symbolic link and copy or hardlink the directory
|
||||
contents at the destination of the link.
|
||||
|
||||
In other words, we can get steps (1) and (3) to disagree by leveraging
|
||||
the dangling symlink to pick a non-local transport in the first step,
|
||||
and then set is_local to "1" in the third step when cloning with
|
||||
`--separate-git-dir`, which makes the symlink non-dangling.
|
||||
|
||||
This can result in data-exfiltration on the victim's machine when
|
||||
sensitive data is at a known path (e.g., "/home/$USER/.ssh").
|
||||
|
||||
The appropriate fix is two-fold:
|
||||
|
||||
- Resolve the transport later on (to avoid using the local
|
||||
clone optimization with a non-local transport).
|
||||
|
||||
- Avoid reading through the top-level "objects" directory when
|
||||
(correctly) using the clone_local() optimization.
|
||||
|
||||
This patch merely demonstrates the issue. The following two patches will
|
||||
implement each part of the above fix, respectively.
|
||||
|
||||
[^1]: Provided that any target directory does not contain symbolic
|
||||
links, in which case the changes from 6f054f9 (builtin/clone.c:
|
||||
disallow `--local` clones with symlinks, 2022-07-28) will abort the
|
||||
clone.
|
||||
|
||||
Reported-by: yvvdwf <yvvdwf@gmail.com>
|
||||
Signed-off-by: Taylor Blau <me@ttaylorr.com>
|
||||
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/git/git/commit/58325b93c5b6212697b088371809e9948fee8052]
|
||||
CVE: CVE-2023-22490
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
t/t5619-clone-local-ambiguous-transport.sh | 63 ++++++++++++++++++++++
|
||||
1 file changed, 63 insertions(+)
|
||||
create mode 100644 t/t5619-clone-local-ambiguous-transport.sh
|
||||
|
||||
diff --git a/t/t5619-clone-local-ambiguous-transport.sh b/t/t5619-clone-local-ambiguous-transport.sh
|
||||
new file mode 100644
|
||||
index 0000000..7ebd31a
|
||||
--- /dev/null
|
||||
+++ b/t/t5619-clone-local-ambiguous-transport.sh
|
||||
@@ -0,0 +1,63 @@
|
||||
+#!/bin/sh
|
||||
+
|
||||
+test_description='test local clone with ambiguous transport'
|
||||
+
|
||||
+. ./test-lib.sh
|
||||
+. "$TEST_DIRECTORY/lib-httpd.sh"
|
||||
+
|
||||
+if ! test_have_prereq SYMLINKS
|
||||
+then
|
||||
+ skip_all='skipping test, symlink support unavailable'
|
||||
+ test_done
|
||||
+fi
|
||||
+
|
||||
+start_httpd
|
||||
+
|
||||
+REPO="$HTTPD_DOCUMENT_ROOT_PATH/sub.git"
|
||||
+URI="$HTTPD_URL/dumb/sub.git"
|
||||
+
|
||||
+test_expect_success 'setup' '
|
||||
+ mkdir -p sensitive &&
|
||||
+ echo "secret" >sensitive/secret &&
|
||||
+
|
||||
+ git init --bare "$REPO" &&
|
||||
+ test_commit_bulk -C "$REPO" --ref=main 1 &&
|
||||
+
|
||||
+ git -C "$REPO" update-ref HEAD main &&
|
||||
+ git -C "$REPO" update-server-info &&
|
||||
+
|
||||
+ git init malicious &&
|
||||
+ (
|
||||
+ cd malicious &&
|
||||
+
|
||||
+ git submodule add "$URI" &&
|
||||
+
|
||||
+ mkdir -p repo/refs &&
|
||||
+ touch repo/refs/.gitkeep &&
|
||||
+ printf "ref: refs/heads/a" >repo/HEAD &&
|
||||
+ ln -s "$(cd .. && pwd)/sensitive" repo/objects &&
|
||||
+
|
||||
+ mkdir -p "$HTTPD_URL/dumb" &&
|
||||
+ ln -s "../../../.git/modules/sub/../../../repo/" "$URI" &&
|
||||
+
|
||||
+ git add . &&
|
||||
+ git commit -m "initial commit"
|
||||
+ ) &&
|
||||
+
|
||||
+ # Delete all of the references in our malicious submodule to
|
||||
+ # avoid the client attempting to checkout any objects (which
|
||||
+ # will be missing, and thus will cause the clone to fail before
|
||||
+ # we can trigger the exploit).
|
||||
+ git -C "$REPO" for-each-ref --format="delete %(refname)" >in &&
|
||||
+ git -C "$REPO" update-ref --stdin <in &&
|
||||
+ git -C "$REPO" update-server-info
|
||||
+'
|
||||
+
|
||||
+test_expect_failure 'ambiguous transport does not lead to arbitrary file-inclusion' '
|
||||
+ git clone malicious clone &&
|
||||
+ git -C clone submodule update --init &&
|
||||
+
|
||||
+ test_path_is_missing clone/.git/modules/sub/objects/secret
|
||||
+'
|
||||
+
|
||||
+test_done
|
||||
--
|
||||
2.25.1
|
||||
|
||||
122
meta/recipes-devtools/git/files/CVE-2023-22490-2.patch
Normal file
122
meta/recipes-devtools/git/files/CVE-2023-22490-2.patch
Normal file
@@ -0,0 +1,122 @@
|
||||
From cf8f6ce02a13f4d1979a53241afbee15a293fce9 Mon Sep 17 00:00:00 2001
|
||||
From: Taylor Blau <me@ttaylorr.com>
|
||||
Date: Tue, 24 Jan 2023 19:43:48 -0500
|
||||
Subject: [PATCH 2/3] clone: delay picking a transport until after get_repo_path()
|
||||
|
||||
In the previous commit, t5619 demonstrates an issue where two calls to
|
||||
`get_repo_path()` could trick Git into using its local clone mechanism
|
||||
in conjunction with a non-local transport.
|
||||
|
||||
That sequence is:
|
||||
|
||||
- the starting state is that the local path https:/example.com/foo is a
|
||||
symlink that points to ../../../.git/modules/foo. So it's dangling.
|
||||
|
||||
- get_repo_path() sees that no such path exists (because it's
|
||||
dangling), and thus we do not canonicalize it into an absolute path
|
||||
|
||||
- because we're using --separate-git-dir, we create .git/modules/foo.
|
||||
Now our symlink is no longer dangling!
|
||||
|
||||
- we pass the url to transport_get(), which sees it as an https URL.
|
||||
|
||||
- we call get_repo_path() again, on the url. This second call was
|
||||
introduced by f38aa83 (use local cloning if insteadOf makes a
|
||||
local URL, 2014-07-17). The idea is that we want to pull the url
|
||||
fresh from the remote.c API, because it will apply any aliases.
|
||||
|
||||
And of course now it sees that there is a local file, which is a
|
||||
mismatch with the transport we already selected.
|
||||
|
||||
The issue in the above sequence is calling `transport_get()` before
|
||||
deciding whether or not the repository is indeed local, and not passing
|
||||
in an absolute path if it is local.
|
||||
|
||||
This is reminiscent of a similar bug report in [1], where it was
|
||||
suggested to perform the `insteadOf` lookup earlier. Taking that
|
||||
approach may not be as straightforward, since the intent is to store the
|
||||
original URL in the config, but to actually fetch from the insteadOf
|
||||
one, so conflating the two early on is a non-starter.
|
||||
|
||||
Note: we pass the path returned by `get_repo_path(remote->url[0])`,
|
||||
which should be the same as `repo_name` (aside from any `insteadOf`
|
||||
rewrites).
|
||||
|
||||
We *could* pass `absolute_pathdup()` of the same argument, which
|
||||
86521ac (Bring local clone's origin URL in line with that of a remote
|
||||
clone, 2008-09-01) indicates may differ depending on the presence of
|
||||
".git/" for a non-bare repo. That matters for forming relative submodule
|
||||
paths, but doesn't matter for the second call, since we're just feeding
|
||||
it to the transport code, which is fine either way.
|
||||
|
||||
[1]: https://lore.kernel.org/git/CAMoD=Bi41mB3QRn3JdZL-FGHs4w3C2jGpnJB-CqSndO7FMtfzA@mail.gmail.com/
|
||||
|
||||
Signed-off-by: Jeff King <peff@peff.net>
|
||||
Signed-off-by: Taylor Blau <me@ttaylorr.com>
|
||||
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/git/git/commit/cf8f6ce02a13f4d1979a53241afbee15a293fce9]
|
||||
CVE: CVE-2023-22490
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
builtin/clone.c | 8 ++++----
|
||||
t/t5619-clone-local-ambiguous-transport.sh | 15 +++++++++++----
|
||||
2 files changed, 15 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/builtin/clone.c b/builtin/clone.c
|
||||
index 53e04b1..b57e703 100644
|
||||
--- a/builtin/clone.c
|
||||
+++ b/builtin/clone.c
|
||||
@@ -1112,10 +1112,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||
branch_top.buf);
|
||||
refspec_append(&remote->fetch, default_refspec.buf);
|
||||
|
||||
- transport = transport_get(remote, remote->url[0]);
|
||||
- transport_set_verbosity(transport, option_verbosity, option_progress);
|
||||
- transport->family = family;
|
||||
-
|
||||
path = get_repo_path(remote->url[0], &is_bundle);
|
||||
is_local = option_local != 0 && path && !is_bundle;
|
||||
if (is_local) {
|
||||
@@ -1135,6 +1131,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
if (option_local > 0 && !is_local)
|
||||
warning(_("--local is ignored"));
|
||||
+
|
||||
+ transport = transport_get(remote, path ? path : remote->url[0]);
|
||||
+ transport_set_verbosity(transport, option_verbosity, option_progress);
|
||||
+ transport->family = family;
|
||||
transport->cloning = 1;
|
||||
|
||||
transport_set_option(transport, TRANS_OPT_KEEP, "yes");
|
||||
diff --git a/t/t5619-clone-local-ambiguous-transport.sh b/t/t5619-clone-local-ambiguous-transport.sh
|
||||
index 7ebd31a..cce62bf 100644
|
||||
--- a/t/t5619-clone-local-ambiguous-transport.sh
|
||||
+++ b/t/t5619-clone-local-ambiguous-transport.sh
|
||||
@@ -53,11 +53,18 @@ test_expect_success 'setup' '
|
||||
git -C "$REPO" update-server-info
|
||||
'
|
||||
|
||||
-test_expect_failure 'ambiguous transport does not lead to arbitrary file-inclusion' '
|
||||
+test_expect_success 'ambiguous transport does not lead to arbitrary file-inclusion' '
|
||||
git clone malicious clone &&
|
||||
- git -C clone submodule update --init &&
|
||||
-
|
||||
- test_path_is_missing clone/.git/modules/sub/objects/secret
|
||||
+ test_must_fail git -C clone submodule update --init 2>err &&
|
||||
+
|
||||
+ test_path_is_missing clone/.git/modules/sub/objects/secret &&
|
||||
+ # We would actually expect "transport .file. not allowed" here,
|
||||
+ # but due to quirks of the URL detection in Git, we mis-parse
|
||||
+ # the absolute path as a bogus URL and die before that step.
|
||||
+ #
|
||||
+ # This works for now, and if we ever fix the URL detection, it
|
||||
+ # is OK to change this to detect the transport error.
|
||||
+ grep "protocol .* is not supported" err
|
||||
'
|
||||
|
||||
test_done
|
||||
--
|
||||
2.25.1
|
||||
|
||||
154
meta/recipes-devtools/git/files/CVE-2023-22490-3.patch
Normal file
154
meta/recipes-devtools/git/files/CVE-2023-22490-3.patch
Normal file
@@ -0,0 +1,154 @@
|
||||
From bffc762f87ae8d18c6001bf0044a76004245754c Mon Sep 17 00:00:00 2001
|
||||
From: Taylor Blau <me@ttaylorr.com>
|
||||
Date: Tue, 24 Jan 2023 19:43:51 -0500
|
||||
Subject: [PATCH 3/3] dir-iterator: prevent top-level symlinks without FOLLOW_SYMLINKS
|
||||
|
||||
When using the dir_iterator API, we first stat(2) the base path, and
|
||||
then use that as a starting point to enumerate the directory's contents.
|
||||
|
||||
If the directory contains symbolic links, we will immediately die() upon
|
||||
encountering them without the `FOLLOW_SYMLINKS` flag. The same is not
|
||||
true when resolving the top-level directory, though.
|
||||
|
||||
As explained in a previous commit, this oversight in 6f054f9
|
||||
(builtin/clone.c: disallow `--local` clones with symlinks, 2022-07-28)
|
||||
can be used as an attack vector to include arbitrary files on a victim's
|
||||
filesystem from outside of the repository.
|
||||
|
||||
Prevent resolving top-level symlinks unless the FOLLOW_SYMLINKS flag is
|
||||
given, which will cause clones of a repository with a symlink'd
|
||||
"$GIT_DIR/objects" directory to fail.
|
||||
|
||||
Signed-off-by: Taylor Blau <me@ttaylorr.com>
|
||||
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/git/git/commit/bffc762f87ae8d18c6001bf0044a76004245754c]
|
||||
CVE: CVE-2023-22490
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
dir-iterator.c | 13 +++++++++----
|
||||
dir-iterator.h | 5 +++++
|
||||
t/t0066-dir-iterator.sh | 27 ++++++++++++++++++++++++++-
|
||||
t/t5604-clone-reference.sh | 16 ++++++++++++++++
|
||||
4 files changed, 56 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/dir-iterator.c b/dir-iterator.c
|
||||
index b17e9f9..3764dd8 100644
|
||||
--- a/dir-iterator.c
|
||||
+++ b/dir-iterator.c
|
||||
@@ -203,7 +203,7 @@ struct dir_iterator *dir_iterator_begin(const char *path, unsigned int flags)
|
||||
{
|
||||
struct dir_iterator_int *iter = xcalloc(1, sizeof(*iter));
|
||||
struct dir_iterator *dir_iterator = &iter->base;
|
||||
- int saved_errno;
|
||||
+ int saved_errno, err;
|
||||
|
||||
strbuf_init(&iter->base.path, PATH_MAX);
|
||||
strbuf_addstr(&iter->base.path, path);
|
||||
@@ -213,10 +213,15 @@ struct dir_iterator *dir_iterator_begin(const char *path, unsigned int flags)
|
||||
iter->flags = flags;
|
||||
|
||||
/*
|
||||
- * Note: stat already checks for NULL or empty strings and
|
||||
- * inexistent paths.
|
||||
+ * Note: stat/lstat already checks for NULL or empty strings and
|
||||
+ * nonexistent paths.
|
||||
*/
|
||||
- if (stat(iter->base.path.buf, &iter->base.st) < 0) {
|
||||
+ if (iter->flags & DIR_ITERATOR_FOLLOW_SYMLINKS)
|
||||
+ err = stat(iter->base.path.buf, &iter->base.st);
|
||||
+ else
|
||||
+ err = lstat(iter->base.path.buf, &iter->base.st);
|
||||
+
|
||||
+ if (err < 0) {
|
||||
saved_errno = errno;
|
||||
goto error_out;
|
||||
}
|
||||
diff --git a/dir-iterator.h b/dir-iterator.h
|
||||
index 0822915..e3b6ff2 100644
|
||||
--- a/dir-iterator.h
|
||||
+++ b/dir-iterator.h
|
||||
@@ -61,6 +61,11 @@
|
||||
* not the symlinks themselves, which is the default behavior. Broken
|
||||
* symlinks are ignored.
|
||||
*
|
||||
+ * Note: setting DIR_ITERATOR_FOLLOW_SYMLINKS affects resolving the
|
||||
+ * starting path as well (e.g., attempting to iterate starting at a
|
||||
+ * symbolic link pointing to a directory without FOLLOW_SYMLINKS will
|
||||
+ * result in an error).
|
||||
+ *
|
||||
* Warning: circular symlinks are also followed when
|
||||
* DIR_ITERATOR_FOLLOW_SYMLINKS is set. The iteration may end up with
|
||||
* an ELOOP if they happen and DIR_ITERATOR_PEDANTIC is set.
|
||||
diff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh
|
||||
index 92910e4..c826f60 100755
|
||||
--- a/t/t0066-dir-iterator.sh
|
||||
+++ b/t/t0066-dir-iterator.sh
|
||||
@@ -109,7 +109,9 @@ test_expect_success SYMLINKS 'setup dirs with symlinks' '
|
||||
mkdir -p dir5/a/c &&
|
||||
ln -s ../c dir5/a/b/d &&
|
||||
ln -s ../ dir5/a/b/e &&
|
||||
- ln -s ../../ dir5/a/b/f
|
||||
+ ln -s ../../ dir5/a/b/f &&
|
||||
+
|
||||
+ ln -s dir4 dir6
|
||||
'
|
||||
|
||||
test_expect_success SYMLINKS 'dir-iterator should not follow symlinks by default' '
|
||||
@@ -145,4 +147,27 @@ test_expect_success SYMLINKS 'dir-iterator should follow symlinks w/ follow flag
|
||||
test_cmp expected-follow-sorted-output actual-follow-sorted-output
|
||||
'
|
||||
|
||||
+test_expect_success SYMLINKS 'dir-iterator does not resolve top-level symlinks' '
|
||||
+ test_must_fail test-tool dir-iterator ./dir6 >out &&
|
||||
+
|
||||
+ grep "ENOTDIR" out
|
||||
+'
|
||||
+
|
||||
+test_expect_success SYMLINKS 'dir-iterator resolves top-level symlinks w/ follow flag' '
|
||||
+ cat >expected-follow-sorted-output <<-EOF &&
|
||||
+ [d] (a) [a] ./dir6/a
|
||||
+ [d] (a/f) [f] ./dir6/a/f
|
||||
+ [d] (a/f/c) [c] ./dir6/a/f/c
|
||||
+ [d] (b) [b] ./dir6/b
|
||||
+ [d] (b/c) [c] ./dir6/b/c
|
||||
+ [f] (a/d) [d] ./dir6/a/d
|
||||
+ [f] (a/e) [e] ./dir6/a/e
|
||||
+ EOF
|
||||
+
|
||||
+ test-tool dir-iterator --follow-symlinks ./dir6 >out &&
|
||||
+ sort out >actual-follow-sorted-output &&
|
||||
+
|
||||
+ test_cmp expected-follow-sorted-output actual-follow-sorted-output
|
||||
+'
|
||||
+
|
||||
test_done
|
||||
diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh
|
||||
index 4894237..615b981 100755
|
||||
--- a/t/t5604-clone-reference.sh
|
||||
+++ b/t/t5604-clone-reference.sh
|
||||
@@ -354,4 +354,20 @@ test_expect_success SYMLINKS 'clone repo with symlinked or unknown files at obje
|
||||
test_must_be_empty T--shared.objects-symlinks.raw
|
||||
'
|
||||
|
||||
+test_expect_success SYMLINKS 'clone repo with symlinked objects directory' '
|
||||
+ test_when_finished "rm -fr sensitive malicious" &&
|
||||
+
|
||||
+ mkdir -p sensitive &&
|
||||
+ echo "secret" >sensitive/file &&
|
||||
+
|
||||
+ git init malicious &&
|
||||
+ rm -fr malicious/.git/objects &&
|
||||
+ ln -s "$(pwd)/sensitive" ./malicious/.git/objects &&
|
||||
+
|
||||
+ test_must_fail git clone --local malicious clone 2>err &&
|
||||
+
|
||||
+ test_path_is_missing clone &&
|
||||
+ grep "failed to start iterator over" err
|
||||
+'
|
||||
+
|
||||
test_done
|
||||
--
|
||||
2.25.1
|
||||
|
||||
184
meta/recipes-devtools/git/files/CVE-2023-23946.patch
Normal file
184
meta/recipes-devtools/git/files/CVE-2023-23946.patch
Normal file
@@ -0,0 +1,184 @@
|
||||
From fade728df1221598f42d391cf377e9e84a32053f Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Steinhardt <ps@pks.im>
|
||||
Date: Thu, 2 Feb 2023 11:54:34 +0100
|
||||
Subject: [PATCH] apply: fix writing behind newly created symbolic links
|
||||
|
||||
When writing files git-apply(1) initially makes sure that none of the
|
||||
files it is about to create are behind a symlink:
|
||||
|
||||
```
|
||||
$ git init repo
|
||||
Initialized empty Git repository in /tmp/repo/.git/
|
||||
$ cd repo/
|
||||
$ ln -s dir symlink
|
||||
$ git apply - <<EOF
|
||||
diff --git a/symlink/file b/symlink/file
|
||||
new file mode 100644
|
||||
index 0000000..e69de29
|
||||
EOF
|
||||
error: affected file 'symlink/file' is beyond a symbolic link
|
||||
```
|
||||
|
||||
This safety mechanism is crucial to ensure that we don't write outside
|
||||
of the repository's working directory. It can be fooled though when the
|
||||
patch that is being applied creates the symbolic link in the first
|
||||
place, which can lead to writing files in arbitrary locations.
|
||||
|
||||
Fix this by checking whether the path we're about to create is
|
||||
beyond a symlink or not. Tightening these checks like this should be
|
||||
fine as we already have these precautions in Git as explained
|
||||
above. Ideally, we should update the check we do up-front before
|
||||
starting to reflect the computed changes to the working tree so that
|
||||
we catch this case as well, but as part of embargoed security work,
|
||||
adding an equivalent check just before we try to write out a file
|
||||
should serve us well as a reasonable first step.
|
||||
|
||||
Digging back into history shows that this vulnerability has existed
|
||||
since at least Git v2.9.0. As Git v2.8.0 and older don't build on my
|
||||
system anymore I cannot tell whether older versions are affected, as
|
||||
well.
|
||||
|
||||
Reported-by: Joern Schneeweisz <jschneeweisz@gitlab.com>
|
||||
Signed-off-by: Patrick Steinhardt <ps@pks.im>
|
||||
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/git/git/commit/fade728df1221598f42d391cf377e9e84a32053f]
|
||||
CVE: CVE-2023-23946
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
apply.c | 27 ++++++++++++++
|
||||
t/t4115-apply-symlink.sh | 81 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 108 insertions(+)
|
||||
|
||||
diff --git a/apply.c b/apply.c
|
||||
index f8a046a..4f303bf 100644
|
||||
--- a/apply.c
|
||||
+++ b/apply.c
|
||||
@@ -4373,6 +4373,33 @@ static int create_one_file(struct apply_state *state,
|
||||
if (state->cached)
|
||||
return 0;
|
||||
|
||||
+ /*
|
||||
+ * We already try to detect whether files are beyond a symlink in our
|
||||
+ * up-front checks. But in the case where symlinks are created by any
|
||||
+ * of the intermediate hunks it can happen that our up-front checks
|
||||
+ * didn't yet see the symlink, but at the point of arriving here there
|
||||
+ * in fact is one. We thus repeat the check for symlinks here.
|
||||
+ *
|
||||
+ * Note that this does not make the up-front check obsolete as the
|
||||
+ * failure mode is different:
|
||||
+ *
|
||||
+ * - The up-front checks cause us to abort before we have written
|
||||
+ * anything into the working directory. So when we exit this way the
|
||||
+ * working directory remains clean.
|
||||
+ *
|
||||
+ * - The checks here happen in the middle of the action where we have
|
||||
+ * already started to apply the patch. The end result will be a dirty
|
||||
+ * working directory.
|
||||
+ *
|
||||
+ * Ideally, we should update the up-front checks to catch what would
|
||||
+ * happen when we apply the patch before we damage the working tree.
|
||||
+ * We have all the information necessary to do so. But for now, as a
|
||||
+ * part of embargoed security work, having this check would serve as a
|
||||
+ * reasonable first step.
|
||||
+ */
|
||||
+ if (path_is_beyond_symlink(state, path))
|
||||
+ return error(_("affected file '%s' is beyond a symbolic link"), path);
|
||||
+
|
||||
res = try_create_file(state, path, mode, buf, size);
|
||||
if (res < 0)
|
||||
return -1;
|
||||
diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh
|
||||
index 872fcda..1acb7b2 100755
|
||||
--- a/t/t4115-apply-symlink.sh
|
||||
+++ b/t/t4115-apply-symlink.sh
|
||||
@@ -44,4 +44,85 @@ test_expect_success 'apply --index symlink patch' '
|
||||
|
||||
'
|
||||
|
||||
+test_expect_success 'symlink setup' '
|
||||
+ ln -s .git symlink &&
|
||||
+ git add symlink &&
|
||||
+ git commit -m "add symlink"
|
||||
+'
|
||||
+
|
||||
+test_expect_success SYMLINKS 'symlink escape when creating new files' '
|
||||
+ test_when_finished "git reset --hard && git clean -dfx" &&
|
||||
+
|
||||
+ cat >patch <<-EOF &&
|
||||
+ diff --git a/symlink b/renamed-symlink
|
||||
+ similarity index 100%
|
||||
+ rename from symlink
|
||||
+ rename to renamed-symlink
|
||||
+ --
|
||||
+ diff --git /dev/null b/renamed-symlink/create-me
|
||||
+ new file mode 100644
|
||||
+ index 0000000..039727e
|
||||
+ --- /dev/null
|
||||
+ +++ b/renamed-symlink/create-me
|
||||
+ @@ -0,0 +1,1 @@
|
||||
+ +busted
|
||||
+ EOF
|
||||
+
|
||||
+ test_must_fail git apply patch 2>stderr &&
|
||||
+ cat >expected_stderr <<-EOF &&
|
||||
+ error: affected file ${SQ}renamed-symlink/create-me${SQ} is beyond a symbolic link
|
||||
+ EOF
|
||||
+ test_cmp expected_stderr stderr &&
|
||||
+ ! test_path_exists .git/create-me
|
||||
+'
|
||||
+
|
||||
+test_expect_success SYMLINKS 'symlink escape when modifying file' '
|
||||
+ test_when_finished "git reset --hard && git clean -dfx" &&
|
||||
+ touch .git/modify-me &&
|
||||
+
|
||||
+ cat >patch <<-EOF &&
|
||||
+ diff --git a/symlink b/renamed-symlink
|
||||
+ similarity index 100%
|
||||
+ rename from symlink
|
||||
+ rename to renamed-symlink
|
||||
+ --
|
||||
+ diff --git a/renamed-symlink/modify-me b/renamed-symlink/modify-me
|
||||
+ index 1111111..2222222 100644
|
||||
+ --- a/renamed-symlink/modify-me
|
||||
+ +++ b/renamed-symlink/modify-me
|
||||
+ @@ -0,0 +1,1 @@
|
||||
+ +busted
|
||||
+ EOF
|
||||
+
|
||||
+ test_must_fail git apply patch 2>stderr &&
|
||||
+ cat >expected_stderr <<-EOF &&
|
||||
+ error: renamed-symlink/modify-me: No such file or directory
|
||||
+ EOF
|
||||
+ test_cmp expected_stderr stderr &&
|
||||
+ test_must_be_empty .git/modify-me
|
||||
+'
|
||||
+
|
||||
+test_expect_success SYMLINKS 'symlink escape when deleting file' '
|
||||
+ test_when_finished "git reset --hard && git clean -dfx && rm .git/delete-me" &&
|
||||
+ touch .git/delete-me &&
|
||||
+
|
||||
+ cat >patch <<-EOF &&
|
||||
+ diff --git a/symlink b/renamed-symlink
|
||||
+ similarity index 100%
|
||||
+ rename from symlink
|
||||
+ rename to renamed-symlink
|
||||
+ --
|
||||
+ diff --git a/renamed-symlink/delete-me b/renamed-symlink/delete-me
|
||||
+ deleted file mode 100644
|
||||
+ index 1111111..0000000 100644
|
||||
+ EOF
|
||||
+
|
||||
+ test_must_fail git apply patch 2>stderr &&
|
||||
+ cat >expected_stderr <<-EOF &&
|
||||
+ error: renamed-symlink/delete-me: No such file or directory
|
||||
+ EOF
|
||||
+ test_cmp expected_stderr stderr &&
|
||||
+ test_path_is_file .git/delete-me
|
||||
+'
|
||||
+
|
||||
test_done
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -24,6 +24,10 @@ SRC_URI = "${KERNELORG_MIRROR}/software/scm/git/git-${PV}.tar.gz;name=tarball \
|
||||
file://CVE-2022-41903-10.patch \
|
||||
file://CVE-2022-41903-11.patch \
|
||||
file://CVE-2022-41903-12.patch \
|
||||
file://CVE-2023-22490-1.patch \
|
||||
file://CVE-2023-22490-2.patch \
|
||||
file://CVE-2023-22490-3.patch \
|
||||
file://CVE-2023-23946.patch \
|
||||
"
|
||||
S = "${WORKDIR}/git-${PV}"
|
||||
|
||||
@@ -37,6 +41,8 @@ CVE_PRODUCT = "git-scm:git"
|
||||
CVE_CHECK_WHITELIST += "CVE-2022-24975"
|
||||
# This is specific to Git-for-Windows
|
||||
CVE_CHECK_WHITELIST += "CVE-2022-41953"
|
||||
# specific to Git for Windows
|
||||
CVE_CHECK_WHITELIST += "CVE-2023-22743"
|
||||
|
||||
PACKAGECONFIG ??= ""
|
||||
PACKAGECONFIG[cvsserver] = ""
|
||||
|
||||
@@ -52,6 +52,12 @@ SRC_URI += "\
|
||||
file://CVE-2022-41715.patch \
|
||||
file://CVE-2022-41717.patch \
|
||||
file://CVE-2022-1962.patch \
|
||||
file://CVE-2022-41723.patch \
|
||||
file://CVE-2022-41722-1.patch \
|
||||
file://CVE-2022-41722-2.patch \
|
||||
file://CVE-2020-29510.patch \
|
||||
file://CVE-2023-24537.patch \
|
||||
file://CVE-2023-24534.patch \
|
||||
"
|
||||
|
||||
SRC_URI_append_libc-musl = " file://0009-ld-replace-glibc-dynamic-linker-with-musl.patch"
|
||||
@@ -79,3 +85,9 @@ CVE_CHECK_WHITELIST += "CVE-2021-41772"
|
||||
|
||||
# Fixes code that was added in go1.16, does not exist in 1.14
|
||||
CVE_CHECK_WHITELIST += "CVE-2022-30630"
|
||||
|
||||
# This is specific to Microsoft Windows
|
||||
CVE_CHECK_WHITELIST += "CVE-2022-41716"
|
||||
|
||||
# Issue introduced in go1.15beta1, does not exist in 1.14
|
||||
CVE_CHECK_WHITELIST += "CVE-2022-1705"
|
||||
|
||||
65
meta/recipes-devtools/go/go-1.14/CVE-2020-29510.patch
Normal file
65
meta/recipes-devtools/go/go-1.14/CVE-2020-29510.patch
Normal file
@@ -0,0 +1,65 @@
|
||||
From a0bf4d38dc2057d28396594264bbdd43d412de22 Mon Sep 17 00:00:00 2001
|
||||
From: Filippo Valsorda <filippo@golang.org>
|
||||
Date: Tue, 27 Oct 2020 00:21:30 +0100
|
||||
Subject: [PATCH] encoding/xml: replace comments inside directives with a space
|
||||
|
||||
A Directive (like <!ENTITY xxx []>) can't have other nodes nested inside
|
||||
it (in our data structure representation), so there is no way to
|
||||
preserve comments. The previous behavior was to just elide them, which
|
||||
however might change the semantic meaning of the surrounding markup.
|
||||
Instead, replace them with a space which hopefully has the same semantic
|
||||
effect of the comment.
|
||||
|
||||
Directives are not actually a node type in the XML spec, which instead
|
||||
specifies each of them separately (<!ENTITY, <!DOCTYPE, etc.), each with
|
||||
its own grammar. The rules for where and when the comments are allowed
|
||||
are not straightforward, and can't be implemented without implementing
|
||||
custom logic for each of the directives.
|
||||
|
||||
Simply preserving the comments in the body of the directive would be
|
||||
problematic, as there can be unmatched quotes inside the comment.
|
||||
Whether those quotes are considered meaningful semantically or not,
|
||||
other parsers might disagree and interpret the output differently.
|
||||
|
||||
This issue was reported by Juho Nurminen of Mattermost as it leads to
|
||||
round-trip mismatches. See #43168. It's not being fixed in a security
|
||||
release because round-trip stability is not a currently supported
|
||||
security property of encoding/xml, and we don't believe these fixes
|
||||
would be sufficient to reliably guarantee it in the future.
|
||||
|
||||
Fixes CVE-2020-29510
|
||||
Updates #43168
|
||||
|
||||
Change-Id: Icd86c75beff3e1e0689543efebdad10ed5178ce3
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/277893
|
||||
Run-TryBot: Filippo Valsorda <filippo@golang.org>
|
||||
TryBot-Result: Go Bot <gobot@golang.org>
|
||||
Trust: Filippo Valsorda <filippo@golang.org>
|
||||
Reviewed-by: Katie Hockman <katie@golang.org>
|
||||
|
||||
Upstream-Status: Backport from https://github.com/golang/go/commit/a9cfd55e2b09735a25976d1b008a0a3c767494f8
|
||||
CVE: CVE-2020-29510
|
||||
Signed-off-by: Shubham Kulkarni <skulkarni@mvista.com>
|
||||
---
|
||||
src/encoding/xml/xml.go | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go
|
||||
index 01a1460..98647b2 100644
|
||||
--- a/src/encoding/xml/xml.go
|
||||
+++ b/src/encoding/xml/xml.go
|
||||
@@ -768,6 +768,12 @@ func (d *Decoder) rawToken() (Token, error) {
|
||||
}
|
||||
b0, b1 = b1, b
|
||||
}
|
||||
+
|
||||
+ // Replace the comment with a space in the returned Directive
|
||||
+ // body, so that markup parts that were separated by the comment
|
||||
+ // (like a "<" and a "!") don't get joined when re-encoding the
|
||||
+ // Directive, taking new semantic meaning.
|
||||
+ d.buf.WriteByte(' ')
|
||||
}
|
||||
}
|
||||
return Directive(d.buf.Bytes()), nil
|
||||
--
|
||||
2.7.4
|
||||
53
meta/recipes-devtools/go/go-1.14/CVE-2022-41722-1.patch
Normal file
53
meta/recipes-devtools/go/go-1.14/CVE-2022-41722-1.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From 94e0c36694fb044e81381d112fef3692de7cdf52 Mon Sep 17 00:00:00 2001
|
||||
From: Yasuhiro Matsumoto <mattn.jp@gmail.com>
|
||||
Date: Fri, 22 Apr 2022 10:07:51 +0900
|
||||
Subject: [PATCH 1/2] path/filepath: do not remove prefix "." when following
|
||||
path contains ":".
|
||||
|
||||
Fixes #52476
|
||||
|
||||
Change-Id: I9eb72ac7dbccd6322d060291f31831dc389eb9bb
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/401595
|
||||
Auto-Submit: Ian Lance Taylor <iant@google.com>
|
||||
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
|
||||
Run-TryBot: Ian Lance Taylor <iant@google.com>
|
||||
Reviewed-by: Ian Lance Taylor <iant@google.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
|
||||
Upstream-Status: Backport from https://github.com/golang/go/commit/9cd1818a7d019c02fa4898b3e45a323e35033290
|
||||
CVE: CVE-2022-41722
|
||||
Signed-off-by: Shubham Kulkarni <skulkarni@mvista.com>
|
||||
---
|
||||
src/path/filepath/path.go | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/path/filepath/path.go b/src/path/filepath/path.go
|
||||
index 26f1833..92dc090 100644
|
||||
--- a/src/path/filepath/path.go
|
||||
+++ b/src/path/filepath/path.go
|
||||
@@ -116,9 +116,21 @@ func Clean(path string) string {
|
||||
case os.IsPathSeparator(path[r]):
|
||||
// empty path element
|
||||
r++
|
||||
- case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])):
|
||||
+ case path[r] == '.' && r+1 == n:
|
||||
// . element
|
||||
r++
|
||||
+ case path[r] == '.' && os.IsPathSeparator(path[r+1]):
|
||||
+ // ./ element
|
||||
+ r++
|
||||
+
|
||||
+ for r < len(path) && os.IsPathSeparator(path[r]) {
|
||||
+ r++
|
||||
+ }
|
||||
+ if out.w == 0 && volumeNameLen(path[r:]) > 0 {
|
||||
+ // When joining prefix "." and an absolute path on Windows,
|
||||
+ // the prefix should not be removed.
|
||||
+ out.append('.')
|
||||
+ }
|
||||
case path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])):
|
||||
// .. element: remove to last separator
|
||||
r += 2
|
||||
--
|
||||
2.7.4
|
||||
104
meta/recipes-devtools/go/go-1.14/CVE-2022-41722-2.patch
Normal file
104
meta/recipes-devtools/go/go-1.14/CVE-2022-41722-2.patch
Normal file
@@ -0,0 +1,104 @@
|
||||
From b8803cb711ae163b8e67897deb6cf8c49702227c Mon Sep 17 00:00:00 2001
|
||||
From: Damien Neil <dneil@google.com>
|
||||
Date: Mon, 12 Dec 2022 16:43:37 -0800
|
||||
Subject: [PATCH 2/2] path/filepath: do not Clean("a/../c:/b") into c:\b on
|
||||
Windows
|
||||
|
||||
Do not permit Clean to convert a relative path into one starting
|
||||
with a drive reference. This change causes Clean to insert a .
|
||||
path element at the start of a path when the original path does not
|
||||
start with a volume name, and the first path element would contain
|
||||
a colon.
|
||||
|
||||
This may introduce a spurious but harmless . path element under
|
||||
some circumstances. For example, Clean("a/../b:/../c") becomes `.\c`.
|
||||
|
||||
This reverts CL 401595, since the change here supersedes the one
|
||||
in that CL.
|
||||
|
||||
Thanks to RyotaK (https://twitter.com/ryotkak) for reporting this issue.
|
||||
|
||||
Updates #57274
|
||||
Fixes #57276
|
||||
Fixes CVE-2022-41722
|
||||
|
||||
Change-Id: I837446285a03aa74c79d7642720e01f354c2ca17
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1675249
|
||||
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
||||
Run-TryBot: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Julie Qiu <julieqiu@google.com>
|
||||
TryBot-Result: Security TryBots <security-trybots@go-security-trybots.iam.gserviceaccount.com>
|
||||
(cherry picked from commit 8ca37f4813ef2f64600c92b83f17c9f3ca6c03a5)
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1728944
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/468119
|
||||
Reviewed-by: Than McIntosh <thanm@google.com>
|
||||
Run-TryBot: Michael Pratt <mpratt@google.com>
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
Auto-Submit: Michael Pratt <mpratt@google.com>
|
||||
|
||||
Upstream-Status: Backport from https://github.com/golang/go/commit/bdf07c2e168baf736e4c057279ca12a4d674f18c
|
||||
CVE: CVE-2022-41722
|
||||
Signed-off-by: Shubham Kulkarni <skulkarni@mvista.com>
|
||||
---
|
||||
src/path/filepath/path.go | 27 ++++++++++++++-------------
|
||||
1 file changed, 14 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/src/path/filepath/path.go b/src/path/filepath/path.go
|
||||
index 92dc090..f0f095e 100644
|
||||
--- a/src/path/filepath/path.go
|
||||
+++ b/src/path/filepath/path.go
|
||||
@@ -14,6 +14,7 @@ package filepath
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
+ "runtime"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
@@ -116,21 +117,9 @@ func Clean(path string) string {
|
||||
case os.IsPathSeparator(path[r]):
|
||||
// empty path element
|
||||
r++
|
||||
- case path[r] == '.' && r+1 == n:
|
||||
+ case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])):
|
||||
// . element
|
||||
r++
|
||||
- case path[r] == '.' && os.IsPathSeparator(path[r+1]):
|
||||
- // ./ element
|
||||
- r++
|
||||
-
|
||||
- for r < len(path) && os.IsPathSeparator(path[r]) {
|
||||
- r++
|
||||
- }
|
||||
- if out.w == 0 && volumeNameLen(path[r:]) > 0 {
|
||||
- // When joining prefix "." and an absolute path on Windows,
|
||||
- // the prefix should not be removed.
|
||||
- out.append('.')
|
||||
- }
|
||||
case path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])):
|
||||
// .. element: remove to last separator
|
||||
r += 2
|
||||
@@ -156,6 +145,18 @@ func Clean(path string) string {
|
||||
if rooted && out.w != 1 || !rooted && out.w != 0 {
|
||||
out.append(Separator)
|
||||
}
|
||||
+ // If a ':' appears in the path element at the start of a Windows path,
|
||||
+ // insert a .\ at the beginning to avoid converting relative paths
|
||||
+ // like a/../c: into c:.
|
||||
+ if runtime.GOOS == "windows" && out.w == 0 && out.volLen == 0 && r != 0 {
|
||||
+ for i := r; i < n && !os.IsPathSeparator(path[i]); i++ {
|
||||
+ if path[i] == ':' {
|
||||
+ out.append('.')
|
||||
+ out.append(Separator)
|
||||
+ break
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
// copy element
|
||||
for ; r < n && !os.IsPathSeparator(path[r]); r++ {
|
||||
out.append(path[r])
|
||||
--
|
||||
2.7.4
|
||||
156
meta/recipes-devtools/go/go-1.14/CVE-2022-41723.patch
Normal file
156
meta/recipes-devtools/go/go-1.14/CVE-2022-41723.patch
Normal file
@@ -0,0 +1,156 @@
|
||||
From 451766789f646617157c725e20c955d4a9a70d4e Mon Sep 17 00:00:00 2001
|
||||
From: Roland Shoemaker <bracewell@google.com>
|
||||
Date: Mon, 6 Feb 2023 10:03:44 -0800
|
||||
Subject: [PATCH] net/http: update bundled golang.org/x/net/http2
|
||||
|
||||
Disable cmd/internal/moddeps test, since this update includes PRIVATE
|
||||
track fixes.
|
||||
|
||||
Fixes CVE-2022-41723
|
||||
Fixes #58355
|
||||
Updates #57855
|
||||
|
||||
Change-Id: Ie870562a6f6e44e4e8f57db6a0dde1a41a2b090c
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1728939
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Julie Qiu <julieqiu@google.com>
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/468118
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
Run-TryBot: Michael Pratt <mpratt@google.com>
|
||||
Auto-Submit: Michael Pratt <mpratt@google.com>
|
||||
Reviewed-by: Than McIntosh <thanm@google.com>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/golang/go/commit/5c3e11bd0b5c0a86e5beffcd4339b86a902b21c3]
|
||||
CVE: CVE-2022-41723
|
||||
Signed-off-by: Shubham Kulkarni <skulkarni@mvista.com>
|
||||
---
|
||||
src/vendor/golang.org/x/net/http2/hpack/hpack.go | 79 +++++++++++++++---------
|
||||
1 file changed, 49 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/src/vendor/golang.org/x/net/http2/hpack/hpack.go b/src/vendor/golang.org/x/net/http2/hpack/hpack.go
|
||||
index 85f18a2..02e80e3 100644
|
||||
--- a/src/vendor/golang.org/x/net/http2/hpack/hpack.go
|
||||
+++ b/src/vendor/golang.org/x/net/http2/hpack/hpack.go
|
||||
@@ -359,6 +359,7 @@ func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error {
|
||||
|
||||
var hf HeaderField
|
||||
wantStr := d.emitEnabled || it.indexed()
|
||||
+ var undecodedName undecodedString
|
||||
if nameIdx > 0 {
|
||||
ihf, ok := d.at(nameIdx)
|
||||
if !ok {
|
||||
@@ -366,15 +367,27 @@ func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error {
|
||||
}
|
||||
hf.Name = ihf.Name
|
||||
} else {
|
||||
- hf.Name, buf, err = d.readString(buf, wantStr)
|
||||
+ undecodedName, buf, err = d.readString(buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
- hf.Value, buf, err = d.readString(buf, wantStr)
|
||||
+ undecodedValue, buf, err := d.readString(buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
+ if wantStr {
|
||||
+ if nameIdx <= 0 {
|
||||
+ hf.Name, err = d.decodeString(undecodedName)
|
||||
+ if err != nil {
|
||||
+ return err
|
||||
+ }
|
||||
+ }
|
||||
+ hf.Value, err = d.decodeString(undecodedValue)
|
||||
+ if err != nil {
|
||||
+ return err
|
||||
+ }
|
||||
+ }
|
||||
d.buf = buf
|
||||
if it.indexed() {
|
||||
d.dynTab.add(hf)
|
||||
@@ -459,46 +472,52 @@ func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) {
|
||||
return 0, origP, errNeedMore
|
||||
}
|
||||
|
||||
-// readString decodes an hpack string from p.
|
||||
+// readString reads an hpack string from p.
|
||||
//
|
||||
-// wantStr is whether s will be used. If false, decompression and
|
||||
-// []byte->string garbage are skipped if s will be ignored
|
||||
-// anyway. This does mean that huffman decoding errors for non-indexed
|
||||
-// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server
|
||||
-// is returning an error anyway, and because they're not indexed, the error
|
||||
-// won't affect the decoding state.
|
||||
-func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) {
|
||||
+// It returns a reference to the encoded string data to permit deferring decode costs
|
||||
+// until after the caller verifies all data is present.
|
||||
+func (d *Decoder) readString(p []byte) (u undecodedString, remain []byte, err error) {
|
||||
if len(p) == 0 {
|
||||
- return "", p, errNeedMore
|
||||
+ return u, p, errNeedMore
|
||||
}
|
||||
isHuff := p[0]&128 != 0
|
||||
strLen, p, err := readVarInt(7, p)
|
||||
if err != nil {
|
||||
- return "", p, err
|
||||
+ return u, p, err
|
||||
}
|
||||
if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) {
|
||||
- return "", nil, ErrStringLength
|
||||
+ // Returning an error here means Huffman decoding errors
|
||||
+ // for non-indexed strings past the maximum string length
|
||||
+ // are ignored, but the server is returning an error anyway
|
||||
+ // and because the string is not indexed the error will not
|
||||
+ // affect the decoding state.
|
||||
+ return u, nil, ErrStringLength
|
||||
}
|
||||
if uint64(len(p)) < strLen {
|
||||
- return "", p, errNeedMore
|
||||
- }
|
||||
- if !isHuff {
|
||||
- if wantStr {
|
||||
- s = string(p[:strLen])
|
||||
- }
|
||||
- return s, p[strLen:], nil
|
||||
+ return u, p, errNeedMore
|
||||
}
|
||||
+ u.isHuff = isHuff
|
||||
+ u.b = p[:strLen]
|
||||
+ return u, p[strLen:], nil
|
||||
+}
|
||||
|
||||
- if wantStr {
|
||||
- buf := bufPool.Get().(*bytes.Buffer)
|
||||
- buf.Reset() // don't trust others
|
||||
- defer bufPool.Put(buf)
|
||||
- if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil {
|
||||
- buf.Reset()
|
||||
- return "", nil, err
|
||||
- }
|
||||
+type undecodedString struct {
|
||||
+ isHuff bool
|
||||
+ b []byte
|
||||
+}
|
||||
+
|
||||
+func (d *Decoder) decodeString(u undecodedString) (string, error) {
|
||||
+ if !u.isHuff {
|
||||
+ return string(u.b), nil
|
||||
+ }
|
||||
+ buf := bufPool.Get().(*bytes.Buffer)
|
||||
+ buf.Reset() // don't trust others
|
||||
+ var s string
|
||||
+ err := huffmanDecode(buf, d.maxStrLen, u.b)
|
||||
+ if err == nil {
|
||||
s = buf.String()
|
||||
- buf.Reset() // be nice to GC
|
||||
}
|
||||
- return s, p[strLen:], nil
|
||||
+ buf.Reset() // be nice to GC
|
||||
+ bufPool.Put(buf)
|
||||
+ return s, err
|
||||
}
|
||||
--
|
||||
2.7.4
|
||||
200
meta/recipes-devtools/go/go-1.14/CVE-2023-24534.patch
Normal file
200
meta/recipes-devtools/go/go-1.14/CVE-2023-24534.patch
Normal file
@@ -0,0 +1,200 @@
|
||||
From d6759e7a059f4208f07aa781402841d7ddaaef96 Mon Sep 17 00:00:00 2001
|
||||
From: Damien Neil <dneil@google.com>
|
||||
Date: Fri, 10 Mar 2023 14:21:05 -0800
|
||||
Subject: [PATCH] [release-branch.go1.19] net/textproto: avoid overpredicting
|
||||
the number of MIME header keys
|
||||
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1802452
|
||||
Run-TryBot: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-by: Julie Qiu <julieqiu@google.com>
|
||||
(cherry picked from commit f739f080a72fd5b06d35c8e244165159645e2ed6)
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1802393
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
Change-Id: I675451438d619a9130360c56daf529559004903f
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/481982
|
||||
Run-TryBot: Michael Knyszek <mknyszek@google.com>
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
|
||||
Auto-Submit: Michael Knyszek <mknyszek@google.com>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/golang/go/commit/d6759e7a059f4208f07aa781402841d7ddaaef96]
|
||||
CVE: CVE-2023-24534
|
||||
Signed-off-by: Vivek Kumbhar <vkumbhar@mvista.com>
|
||||
---
|
||||
src/bytes/bytes.go | 13 +++++++
|
||||
src/net/textproto/reader.go | 31 +++++++++++------
|
||||
src/net/textproto/reader_test.go | 59 ++++++++++++++++++++++++++++++++
|
||||
3 files changed, 92 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
|
||||
index e872cc2..1f0d760 100644
|
||||
--- a/src/bytes/bytes.go
|
||||
+++ b/src/bytes/bytes.go
|
||||
@@ -1078,6 +1078,19 @@ func Index(s, sep []byte) int {
|
||||
return -1
|
||||
}
|
||||
|
||||
+// Cut slices s around the first instance of sep,
|
||||
+// returning the text before and after sep.
|
||||
+// The found result reports whether sep appears in s.
|
||||
+// If sep does not appear in s, cut returns s, nil, false.
|
||||
+//
|
||||
+// Cut returns slices of the original slice s, not copies.
|
||||
+func Cut(s, sep []byte) (before, after []byte, found bool) {
|
||||
+ if i := Index(s, sep); i >= 0 {
|
||||
+ return s[:i], s[i+len(sep):], true
|
||||
+ }
|
||||
+ return s, nil, false
|
||||
+}
|
||||
+
|
||||
func indexRabinKarp(s, sep []byte) int {
|
||||
// Rabin-Karp search
|
||||
hashsep, pow := hashStr(sep)
|
||||
diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go
|
||||
index a505da9..8d547fe 100644
|
||||
--- a/src/net/textproto/reader.go
|
||||
+++ b/src/net/textproto/reader.go
|
||||
@@ -486,8 +487,11 @@ func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) {
|
||||
// large one ahead of time which we'll cut up into smaller
|
||||
// slices. If this isn't big enough later, we allocate small ones.
|
||||
var strs []string
|
||||
- hint := r.upcomingHeaderNewlines()
|
||||
+ hint := r.upcomingHeaderKeys()
|
||||
if hint > 0 {
|
||||
+ if hint > 1000 {
|
||||
+ hint = 1000 // set a cap to avoid overallocation
|
||||
+ }
|
||||
strs = make([]string, hint)
|
||||
}
|
||||
|
||||
@@ -562,9 +566,11 @@ func mustHaveFieldNameColon(line []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
-// upcomingHeaderNewlines returns an approximation of the number of newlines
|
||||
+var nl = []byte("\n")
|
||||
+
|
||||
+// upcomingHeaderKeys returns an approximation of the number of keys
|
||||
// that will be in this header. If it gets confused, it returns 0.
|
||||
-func (r *Reader) upcomingHeaderNewlines() (n int) {
|
||||
+func (r *Reader) upcomingHeaderKeys() (n int) {
|
||||
// Try to determine the 'hint' size.
|
||||
r.R.Peek(1) // force a buffer load if empty
|
||||
s := r.R.Buffered()
|
||||
@@ -572,17 +578,20 @@ func (r *Reader) upcomingHeaderNewlines() (n int) {
|
||||
return
|
||||
}
|
||||
peek, _ := r.R.Peek(s)
|
||||
- for len(peek) > 0 {
|
||||
- i := bytes.IndexByte(peek, '\n')
|
||||
- if i < 3 {
|
||||
- // Not present (-1) or found within the next few bytes,
|
||||
- // implying we're at the end ("\r\n\r\n" or "\n\n")
|
||||
- return
|
||||
+ for len(peek) > 0 && n < 1000 {
|
||||
+ var line []byte
|
||||
+ line, peek, _ = bytes.Cut(peek, nl)
|
||||
+ if len(line) == 0 || (len(line) == 1 && line[0] == '\r') {
|
||||
+ // Blank line separating headers from the body.
|
||||
+ break
|
||||
+ }
|
||||
+ if line[0] == ' ' || line[0] == '\t' {
|
||||
+ // Folded continuation of the previous line.
|
||||
+ continue
|
||||
}
|
||||
n++
|
||||
- peek = peek[i+1:]
|
||||
}
|
||||
- return
|
||||
+ return n
|
||||
}
|
||||
|
||||
// CanonicalMIMEHeaderKey returns the canonical format of the
|
||||
diff --git a/src/net/textproto/reader_test.go b/src/net/textproto/reader_test.go
|
||||
index 3124d43..3ae0de1 100644
|
||||
--- a/src/net/textproto/reader_test.go
|
||||
+++ b/src/net/textproto/reader_test.go
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"bytes"
|
||||
"io"
|
||||
"reflect"
|
||||
+ "runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
@@ -127,6 +128,42 @@ func TestReadMIMEHeaderSingle(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
+// TestReaderUpcomingHeaderKeys is testing an internal function, but it's very
|
||||
+// difficult to test well via the external API.
|
||||
+func TestReaderUpcomingHeaderKeys(t *testing.T) {
|
||||
+ for _, test := range []struct {
|
||||
+ input string
|
||||
+ want int
|
||||
+ }{{
|
||||
+ input: "",
|
||||
+ want: 0,
|
||||
+ }, {
|
||||
+ input: "A: v",
|
||||
+ want: 1,
|
||||
+ }, {
|
||||
+ input: "A: v\r\nB: v\r\n",
|
||||
+ want: 2,
|
||||
+ }, {
|
||||
+ input: "A: v\nB: v\n",
|
||||
+ want: 2,
|
||||
+ }, {
|
||||
+ input: "A: v\r\n continued\r\n still continued\r\nB: v\r\n\r\n",
|
||||
+ want: 2,
|
||||
+ }, {
|
||||
+ input: "A: v\r\n\r\nB: v\r\nC: v\r\n",
|
||||
+ want: 1,
|
||||
+ }, {
|
||||
+ input: "A: v" + strings.Repeat("\n", 1000),
|
||||
+ want: 1,
|
||||
+ }} {
|
||||
+ r := reader(test.input)
|
||||
+ got := r.upcomingHeaderKeys()
|
||||
+ if test.want != got {
|
||||
+ t.Fatalf("upcomingHeaderKeys(%q): %v; want %v", test.input, got, test.want)
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
func TestReadMIMEHeaderNoKey(t *testing.T) {
|
||||
r := reader(": bar\ntest-1: 1\n\n")
|
||||
m, err := r.ReadMIMEHeader()
|
||||
@@ -223,6 +260,28 @@ func TestReadMIMEHeaderTrimContinued(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
+// Test that reading a header doesn't overallocate. Issue 58975.
|
||||
+func TestReadMIMEHeaderAllocations(t *testing.T) {
|
||||
+ var totalAlloc uint64
|
||||
+ const count = 200
|
||||
+ for i := 0; i < count; i++ {
|
||||
+ r := reader("A: b\r\n\r\n" + strings.Repeat("\n", 4096))
|
||||
+ var m1, m2 runtime.MemStats
|
||||
+ runtime.ReadMemStats(&m1)
|
||||
+ _, err := r.ReadMIMEHeader()
|
||||
+ if err != nil {
|
||||
+ t.Fatalf("ReadMIMEHeader: %v", err)
|
||||
+ }
|
||||
+ runtime.ReadMemStats(&m2)
|
||||
+ totalAlloc += m2.TotalAlloc - m1.TotalAlloc
|
||||
+ }
|
||||
+ // 32k is large and we actually allocate substantially less,
|
||||
+ // but prior to the fix for #58975 we allocated ~400k in this case.
|
||||
+ if got, want := totalAlloc/count, uint64(32768); got > want {
|
||||
+ t.Fatalf("ReadMIMEHeader allocated %v bytes, want < %v", got, want)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
type readResponseTest struct {
|
||||
in string
|
||||
inCode int
|
||||
--
|
||||
2.25.1
|
||||
76
meta/recipes-devtools/go/go-1.14/CVE-2023-24537.patch
Normal file
76
meta/recipes-devtools/go/go-1.14/CVE-2023-24537.patch
Normal file
@@ -0,0 +1,76 @@
|
||||
From bf8c7c575c8a552d9d79deb29e80854dc88528d0 Mon Sep 17 00:00:00 2001
|
||||
From: Damien Neil <dneil@google.com>
|
||||
Date: Mon, 20 Mar 2023 10:43:19 -0700
|
||||
Subject: [PATCH] [release-branch.go1.20] mime/multipart: limit parsed mime
|
||||
message sizes
|
||||
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1802456
|
||||
Reviewed-by: Julie Qiu <julieqiu@google.com>
|
||||
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
||||
Run-TryBot: Damien Neil <dneil@google.com>
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1802611
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Change-Id: Ifdfa192d54f722d781a4d8c5f35b5fb72d122168
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/481986
|
||||
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
Run-TryBot: Michael Knyszek <mknyszek@google.com>
|
||||
Auto-Submit: Michael Knyszek <mknyszek@google.com>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/golang/go/commit/126a1d02da82f93ede7ce0bd8d3c51ef627f2104]
|
||||
CVE: CVE-2023-24537
|
||||
Signed-off-by: Vivek Kumbhar <vkumbhar@mvista.com>
|
||||
---
|
||||
src/go/parser/parser_test.go | 16 ++++++++++++++++
|
||||
src/go/scanner/scanner.go | 5 ++++-
|
||||
2 files changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/go/parser/parser_test.go b/src/go/parser/parser_test.go
|
||||
index 37a6a2b..714557c 100644
|
||||
--- a/src/go/parser/parser_test.go
|
||||
+++ b/src/go/parser/parser_test.go
|
||||
@@ -738,3 +738,19 @@ func TestScopeDepthLimit(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+// TestIssue59180 tests that line number overflow doesn't cause an infinite loop.
|
||||
+func TestIssue59180(t *testing.T) {
|
||||
+ testcases := []string{
|
||||
+ "package p\n//line :9223372036854775806\n\n//",
|
||||
+ "package p\n//line :1:9223372036854775806\n\n//",
|
||||
+ "package p\n//line file:9223372036854775806\n\n//",
|
||||
+ }
|
||||
+
|
||||
+ for _, src := range testcases {
|
||||
+ _, err := ParseFile(token.NewFileSet(), "", src, ParseComments)
|
||||
+ if err == nil {
|
||||
+ t.Errorf("ParseFile(%s) succeeded unexpectedly", src)
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/go/scanner/scanner.go b/src/go/scanner/scanner.go
|
||||
index 00fe2dc..3159d25 100644
|
||||
--- a/src/go/scanner/scanner.go
|
||||
+++ b/src/go/scanner/scanner.go
|
||||
@@ -246,13 +246,16 @@ func (s *Scanner) updateLineInfo(next, offs int, text []byte) {
|
||||
return
|
||||
}
|
||||
|
||||
+ // Put a cap on the maximum size of line and column numbers.
|
||||
+ // 30 bits allows for some additional space before wrapping an int32.
|
||||
+ const maxLineCol = 1<<30 - 1
|
||||
var line, col int
|
||||
i2, n2, ok2 := trailingDigits(text[:i-1])
|
||||
if ok2 {
|
||||
//line filename:line:col
|
||||
i, i2 = i2, i
|
||||
line, col = n2, n
|
||||
- if col == 0 {
|
||||
+ if col == 0 || col > maxLineCol {
|
||||
s.error(offs+i2, "invalid column number: "+string(text[i2:]))
|
||||
return
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -112,10 +112,31 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \
|
||||
file://CVE-2022-0216-1.patch \
|
||||
file://CVE-2022-0216-2.patch \
|
||||
file://CVE-2021-3750.patch \
|
||||
file://CVE-2021-3638.patch \
|
||||
file://CVE-2021-20196.patch \
|
||||
file://CVE-2021-3507.patch \
|
||||
file://CVE-2021-3929.patch \
|
||||
file://CVE-2021-3638.patch \
|
||||
file://CVE-2021-20196.patch \
|
||||
file://CVE-2021-3507.patch \
|
||||
file://hw-block-nvme-refactor-nvme_addr_read.patch \
|
||||
file://hw-block-nvme-handle-dma-errors.patch \
|
||||
file://CVE-2021-3929.patch \
|
||||
file://CVE-2022-4144.patch \
|
||||
file://CVE-2020-15859.patch \
|
||||
file://CVE-2020-15469-1.patch \
|
||||
file://CVE-2020-15469-2.patch \
|
||||
file://CVE-2020-15469-3.patch \
|
||||
file://CVE-2020-15469-4.patch \
|
||||
file://CVE-2020-15469-5.patch \
|
||||
file://CVE-2020-15469-6.patch \
|
||||
file://CVE-2020-15469-7.patch \
|
||||
file://CVE-2020-15469-8.patch \
|
||||
file://CVE-2020-35504.patch \
|
||||
file://CVE-2020-35505.patch \
|
||||
file://CVE-2022-26354.patch \
|
||||
file://CVE-2021-3409-1.patch \
|
||||
file://CVE-2021-3409-2.patch \
|
||||
file://CVE-2021-3409-3.patch \
|
||||
file://CVE-2021-3409-4.patch \
|
||||
file://CVE-2021-3409-5.patch \
|
||||
file://hw-display-qxl-Pass-requested-buffer-size-to-qxl_phy.patch \
|
||||
"
|
||||
UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar"
|
||||
|
||||
@@ -136,6 +157,11 @@ CVE_CHECK_WHITELIST += "CVE-2018-18438"
|
||||
# the issue introduced in v5.1.0-rc0
|
||||
CVE_CHECK_WHITELIST += "CVE-2020-27661"
|
||||
|
||||
# As per https://nvd.nist.gov/vuln/detail/CVE-2023-0664
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=2167423
|
||||
# this bug related to windows specific.
|
||||
CVE_CHECK_WHITELIST += "CVE-2023-0664"
|
||||
|
||||
COMPATIBLE_HOST_mipsarchn32 = "null"
|
||||
COMPATIBLE_HOST_mipsarchn64 = "null"
|
||||
|
||||
|
||||
50
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-1.patch
Normal file
50
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-1.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
From 520f26fc6d17b71a43eaf620e834b3bdf316f3d3 Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:25 +0530
|
||||
Subject: [PATCH] hw/pci-host: add pci-intack write method
|
||||
|
||||
Add pci-intack mmio write method to avoid NULL pointer dereference
|
||||
issue.
|
||||
|
||||
Reported-by: Lei Sun <slei.casper@gmail.com>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Message-Id: <20200811114133.672647-2-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu
|
||||
https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-1.patch?h=ubuntu/focal-security
|
||||
Upstream commit https://github.com/qemu/qemu/commit/520f26fc6d17b71a43eaf620e834b3bdf316f3d3 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/pci-host/prep.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/hw/pci-host/prep.c
|
||||
+++ b/hw/pci-host/prep.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/units.h"
|
||||
+#include "qemu/log.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
@@ -119,8 +120,15 @@ static uint64_t raven_intack_read(void *
|
||||
return pic_read_irq(isa_pic);
|
||||
}
|
||||
|
||||
+static void raven_intack_write(void *opaque, hwaddr addr,
|
||||
+ uint64_t data, unsigned size)
|
||||
+{
|
||||
+ qemu_log_mask(LOG_UNIMP, "%s not implemented\n", __func__);
|
||||
+}
|
||||
+
|
||||
static const MemoryRegionOps raven_intack_ops = {
|
||||
.read = raven_intack_read,
|
||||
+ .write = raven_intack_write,
|
||||
.valid = {
|
||||
.max_access_size = 1,
|
||||
},
|
||||
69
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-2.patch
Normal file
69
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-2.patch
Normal file
@@ -0,0 +1,69 @@
|
||||
From 4f2a5202a05fc1612954804a2482f07bff105ea2 Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:26 +0530
|
||||
Subject: [PATCH] pci-host: designware: add pcie-msi read method
|
||||
|
||||
Add pcie-msi mmio read method to avoid NULL pointer dereference
|
||||
issue.
|
||||
|
||||
Reported-by: Lei Sun <slei.casper@gmail.com>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Message-Id: <20200811114133.672647-3-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-2.patch?h=ubuntu/focal-security Upstream Commit https://github.com/qemu/qemu/commit/4f2a5202a05fc1612954804a2482f07bff105ea2]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/pci-host/designware.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/hw/pci-host/designware.c b/hw/pci-host/designware.c
|
||||
index f9fb97a..bde3a34 100644
|
||||
--- a/hw/pci-host/designware.c
|
||||
+++ b/hw/pci-host/designware.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/module.h"
|
||||
+#include "qemu/log.h"
|
||||
#include "hw/pci/msi.h"
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
@@ -63,6 +64,23 @@ designware_pcie_root_to_host(DesignwarePCIERoot *root)
|
||||
return DESIGNWARE_PCIE_HOST(bus->parent);
|
||||
}
|
||||
|
||||
+static uint64_t designware_pcie_root_msi_read(void *opaque, hwaddr addr,
|
||||
+ unsigned size)
|
||||
+{
|
||||
+ /*
|
||||
+ * Attempts to read from the MSI address are undefined in
|
||||
+ * the PCI specifications. For this hardware, the datasheet
|
||||
+ * specifies that a read from the magic address is simply not
|
||||
+ * intercepted by the MSI controller, and will go out to the
|
||||
+ * AHB/AXI bus like any other PCI-device-initiated DMA read.
|
||||
+ * This is not trivial to implement in QEMU, so since
|
||||
+ * well-behaved guests won't ever ask a PCI device to DMA from
|
||||
+ * this address we just log the missing functionality.
|
||||
+ */
|
||||
+ qemu_log_mask(LOG_UNIMP, "%s not implemented\n", __func__);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void designware_pcie_root_msi_write(void *opaque, hwaddr addr,
|
||||
uint64_t val, unsigned len)
|
||||
{
|
||||
@@ -77,6 +95,7 @@ static void designware_pcie_root_msi_write(void *opaque, hwaddr addr,
|
||||
}
|
||||
|
||||
static const MemoryRegionOps designware_pci_host_msi_ops = {
|
||||
+ .read = designware_pcie_root_msi_read,
|
||||
.write = designware_pcie_root_msi_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid = {
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
49
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-3.patch
Normal file
49
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-3.patch
Normal file
@@ -0,0 +1,49 @@
|
||||
From 24202d2b561c3b4c48bd28383c8c34b4ac66c2bf Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:27 +0530
|
||||
Subject: [PATCH] vfio: add quirk device write method
|
||||
|
||||
Add vfio quirk device mmio write method to avoid NULL pointer
|
||||
dereference issue.
|
||||
|
||||
Reported-by: Lei Sun <slei.casper@gmail.com>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Acked-by: Alex Williamson <alex.williamson@redhat.com>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Message-Id: <20200811114133.672647-4-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-3.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/24202d2b561c3b4c48bd28383c8c34b4ac66c2bf]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/vfio/pci-quirks.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/hw/vfio/pci-quirks.c
|
||||
+++ b/hw/vfio/pci-quirks.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "exec/memop.h"
|
||||
#include "qemu/units.h"
|
||||
+#include "qemu/log.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/module.h"
|
||||
@@ -278,8 +279,15 @@ static uint64_t vfio_ati_3c3_quirk_read(
|
||||
return data;
|
||||
}
|
||||
|
||||
+static void vfio_ati_3c3_quirk_write(void *opaque, hwaddr addr,
|
||||
+ uint64_t data, unsigned size)
|
||||
+{
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid access\n", __func__);
|
||||
+}
|
||||
+
|
||||
static const MemoryRegionOps vfio_ati_3c3_quirk = {
|
||||
.read = vfio_ati_3c3_quirk_read,
|
||||
+ .write = vfio_ati_3c3_quirk_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
53
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-4.patch
Normal file
53
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-4.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From f867cebaedbc9c43189f102e4cdfdff05e88df7f Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:28 +0530
|
||||
Subject: [PATCH] prep: add ppc-parity write method
|
||||
|
||||
Add ppc-parity mmio write method to avoid NULL pointer dereference
|
||||
issue.
|
||||
|
||||
Reported-by: Lei Sun <slei.casper@gmail.com>
|
||||
Acked-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Message-Id: <20200811114133.672647-5-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-4.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/f867cebaedbc9c43189f102e4cdfdff05e88df7f]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/ppc/prep_systemio.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/hw/ppc/prep_systemio.c b/hw/ppc/prep_systemio.c
|
||||
index 4e48ef2..b2bd783 100644
|
||||
--- a/hw/ppc/prep_systemio.c
|
||||
+++ b/hw/ppc/prep_systemio.c
|
||||
@@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
+#include "qemu/log.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@@ -235,8 +236,15 @@ static uint64_t ppc_parity_error_readl(void *opaque, hwaddr addr,
|
||||
return val;
|
||||
}
|
||||
|
||||
+static void ppc_parity_error_writel(void *opaque, hwaddr addr,
|
||||
+ uint64_t data, unsigned size)
|
||||
+{
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid access\n", __func__);
|
||||
+}
|
||||
+
|
||||
static const MemoryRegionOps ppc_parity_error_ops = {
|
||||
.read = ppc_parity_error_readl,
|
||||
+ .write = ppc_parity_error_writel,
|
||||
.valid = {
|
||||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
53
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-5.patch
Normal file
53
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-5.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From b5bf601f364e1a14ca4c3276f88dfec024acf613 Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:29 +0530
|
||||
Subject: [PATCH] nvram: add nrf51_soc flash read method
|
||||
|
||||
Add nrf51_soc mmio read method to avoid NULL pointer dereference
|
||||
issue.
|
||||
|
||||
Reported-by: Lei Sun <slei.casper@gmail.com>
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Message-Id: <20200811114133.672647-6-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-5.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/b5bf601f364e1a14ca4c3276f88dfec024acf613 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/nvram/nrf51_nvm.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/hw/nvram/nrf51_nvm.c b/hw/nvram/nrf51_nvm.c
|
||||
index f2283c1..7b3460d 100644
|
||||
--- a/hw/nvram/nrf51_nvm.c
|
||||
+++ b/hw/nvram/nrf51_nvm.c
|
||||
@@ -273,6 +273,15 @@ static const MemoryRegionOps io_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
+static uint64_t flash_read(void *opaque, hwaddr offset, unsigned size)
|
||||
+{
|
||||
+ /*
|
||||
+ * This is a rom_device MemoryRegion which is always in
|
||||
+ * romd_mode (we never put it in MMIO mode), so reads always
|
||||
+ * go directly to RAM and never come here.
|
||||
+ */
|
||||
+ g_assert_not_reached();
|
||||
+}
|
||||
|
||||
static void flash_write(void *opaque, hwaddr offset, uint64_t value,
|
||||
unsigned int size)
|
||||
@@ -300,6 +309,7 @@ static void flash_write(void *opaque, hwaddr offset, uint64_t value,
|
||||
|
||||
|
||||
static const MemoryRegionOps flash_ops = {
|
||||
+ .read = flash_read,
|
||||
.write = flash_write,
|
||||
.valid.min_access_size = 4,
|
||||
.valid.max_access_size = 4,
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
61
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-6.patch
Normal file
61
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-6.patch
Normal file
@@ -0,0 +1,61 @@
|
||||
Backport of:
|
||||
|
||||
From 921604e175b8ec06c39503310e7b3ec1e3eafe9e Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:30 +0530
|
||||
Subject: [PATCH] spapr_pci: add spapr msi read method
|
||||
|
||||
Add spapr msi mmio read method to avoid NULL pointer dereference
|
||||
issue.
|
||||
|
||||
Reported-by: Lei Sun <slei.casper@gmail.com>
|
||||
Acked-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Message-Id: <20200811114133.672647-7-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-6.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/921604e175b8ec06c39503310e7b3ec1e3eafe9e]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/ppc/spapr_pci.c | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/hw/ppc/spapr_pci.c
|
||||
+++ b/hw/ppc/spapr_pci.c
|
||||
@@ -52,6 +52,7 @@
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/hostmem.h"
|
||||
#include "sysemu/numa.h"
|
||||
+#include "qemu/log.h"
|
||||
|
||||
/* Copied from the kernel arch/powerpc/platforms/pseries/msi.c */
|
||||
#define RTAS_QUERY_FN 0
|
||||
@@ -738,6 +739,12 @@ static PCIINTxRoute spapr_route_intx_pin
|
||||
return route;
|
||||
}
|
||||
|
||||
+static uint64_t spapr_msi_read(void *opaque, hwaddr addr, unsigned size)
|
||||
+{
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid access\n", __func__);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* MSI/MSIX memory region implementation.
|
||||
* The handler handles both MSI and MSIX.
|
||||
@@ -755,8 +762,11 @@ static void spapr_msi_write(void *opaque
|
||||
}
|
||||
|
||||
static const MemoryRegionOps spapr_msi_ops = {
|
||||
- /* There is no .read as the read result is undefined by PCI spec */
|
||||
- .read = NULL,
|
||||
+ /*
|
||||
+ * .read result is undefined by PCI spec.
|
||||
+ * define .read method to avoid assert failure in memory_region_init_io
|
||||
+ */
|
||||
+ .read = spapr_msi_read,
|
||||
.write = spapr_msi_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN
|
||||
};
|
||||
50
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-7.patch
Normal file
50
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-7.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
From 2c9fb3b784000c1df32231e1c2464bb2e3fc4620 Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:31 +0530
|
||||
Subject: [PATCH] tz-ppc: add dummy read/write methods
|
||||
|
||||
Add tz-ppc-dummy mmio read/write methods to avoid assert failure
|
||||
during initialisation.
|
||||
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Message-Id: <20200811114133.672647-8-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-7.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/2c9fb3b784000c1df32231e1c2464bb2e3fc4620 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/misc/tz-ppc.c | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/hw/misc/tz-ppc.c b/hw/misc/tz-ppc.c
|
||||
index 6431257..36495c6 100644
|
||||
--- a/hw/misc/tz-ppc.c
|
||||
+++ b/hw/misc/tz-ppc.c
|
||||
@@ -196,7 +196,21 @@ static bool tz_ppc_dummy_accepts(void *opaque, hwaddr addr,
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
+static uint64_t tz_ppc_dummy_read(void *opaque, hwaddr addr, unsigned size)
|
||||
+{
|
||||
+ g_assert_not_reached();
|
||||
+}
|
||||
+
|
||||
+static void tz_ppc_dummy_write(void *opaque, hwaddr addr,
|
||||
+ uint64_t data, unsigned size)
|
||||
+{
|
||||
+ g_assert_not_reached();
|
||||
+}
|
||||
+
|
||||
static const MemoryRegionOps tz_ppc_dummy_ops = {
|
||||
+ /* define r/w methods to avoid assert failure in memory_region_init_io */
|
||||
+ .read = tz_ppc_dummy_read,
|
||||
+ .write = tz_ppc_dummy_write,
|
||||
.valid.accepts = tz_ppc_dummy_accepts,
|
||||
};
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
44
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-8.patch
Normal file
44
meta/recipes-devtools/qemu/qemu/CVE-2020-15469-8.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
From 735754aaa15a6ed46db51fd731e88331c446ea54 Mon Sep 17 00:00:00 2001
|
||||
From: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Date: Tue, 11 Aug 2020 17:11:32 +0530
|
||||
Subject: [PATCH] imx7-ccm: add digprog mmio write method
|
||||
|
||||
Add digprog mmio write method to avoid assert failure during
|
||||
initialisation.
|
||||
|
||||
Reviewed-by: Li Qiang <liq3ea@gmail.com>
|
||||
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
|
||||
Message-Id: <20200811114133.672647-9-ppandit@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15469
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-15469-8.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/735754aaa15a6ed46db51fd731e88331c446ea54]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/misc/imx7_ccm.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/hw/misc/imx7_ccm.c b/hw/misc/imx7_ccm.c
|
||||
index 02fc1ae..075159e 100644
|
||||
--- a/hw/misc/imx7_ccm.c
|
||||
+++ b/hw/misc/imx7_ccm.c
|
||||
@@ -131,8 +131,16 @@ static const struct MemoryRegionOps imx7_set_clr_tog_ops = {
|
||||
},
|
||||
};
|
||||
|
||||
+static void imx7_digprog_write(void *opaque, hwaddr addr,
|
||||
+ uint64_t data, unsigned size)
|
||||
+{
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR,
|
||||
+ "Guest write to read-only ANALOG_DIGPROG register\n");
|
||||
+}
|
||||
+
|
||||
static const struct MemoryRegionOps imx7_digprog_ops = {
|
||||
.read = imx7_set_clr_tog_read,
|
||||
+ .write = imx7_digprog_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.impl = {
|
||||
.min_access_size = 4,
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
39
meta/recipes-devtools/qemu/qemu/CVE-2020-15859.patch
Normal file
39
meta/recipes-devtools/qemu/qemu/CVE-2020-15859.patch
Normal file
@@ -0,0 +1,39 @@
|
||||
From 22dc8663d9fc7baa22100544c600b6285a63c7a3 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Wang <jasowang@redhat.com>
|
||||
Date: Wed, 22 Jul 2020 16:57:46 +0800
|
||||
Subject: [PATCH] net: forbid the reentrant RX
|
||||
|
||||
The memory API allows DMA into NIC's MMIO area. This means the NIC's
|
||||
RX routine must be reentrant. Instead of auditing all the NIC, we can
|
||||
simply detect the reentrancy and return early. The queue->delivering
|
||||
is set and cleared by qemu_net_queue_deliver() for other queue helpers
|
||||
to know whether the delivering in on going (NIC's receive is being
|
||||
called). We can check it and return early in qemu_net_queue_flush() to
|
||||
forbid reentrant RX.
|
||||
|
||||
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||||
|
||||
CVE: CVE-2020-15859
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/ubuntu/CVE-2020-15859.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/22dc8663d9fc7baa22100544c600b6285a63c7a3 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
net/queue.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/net/queue.c b/net/queue.c
|
||||
index 0164727..19e32c8 100644
|
||||
--- a/net/queue.c
|
||||
+++ b/net/queue.c
|
||||
@@ -250,6 +250,9 @@ void qemu_net_queue_purge(NetQueue *queue, NetClientState *from)
|
||||
|
||||
bool qemu_net_queue_flush(NetQueue *queue)
|
||||
{
|
||||
+ if (queue->delivering)
|
||||
+ return false;
|
||||
+
|
||||
while (!QTAILQ_EMPTY(&queue->packets)) {
|
||||
NetPacket *packet;
|
||||
int ret;
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
51
meta/recipes-devtools/qemu/qemu/CVE-2020-35504.patch
Normal file
51
meta/recipes-devtools/qemu/qemu/CVE-2020-35504.patch
Normal file
@@ -0,0 +1,51 @@
|
||||
Backport of:
|
||||
|
||||
From 0db895361b8a82e1114372ff9f4857abea605701 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
||||
Date: Wed, 7 Apr 2021 20:57:50 +0100
|
||||
Subject: [PATCH] esp: always check current_req is not NULL before use in DMA
|
||||
callbacks
|
||||
|
||||
After issuing a SCSI command the SCSI layer can call the SCSIBusInfo .cancel
|
||||
callback which resets both current_req and current_dev to NULL. If any data
|
||||
is left in the transfer buffer (async_len != 0) then the next TI (Transfer
|
||||
Information) command will attempt to reference the NULL pointer causing a
|
||||
segfault.
|
||||
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1910723
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1909247
|
||||
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Message-Id: <20210407195801.685-2-mark.cave-ayland@ilande.co.uk>
|
||||
|
||||
CVE: CVE-2020-35504
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-35504.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/0db895361b8a82e1114372ff9f4857abea605701 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/scsi/esp.c | 19 ++++++++++++++-----
|
||||
1 file changed, 14 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/hw/scsi/esp.c
|
||||
+++ b/hw/scsi/esp.c
|
||||
@@ -362,6 +362,11 @@ static void do_dma_pdma_cb(ESPState *s)
|
||||
do_cmd(s, s->cmdbuf);
|
||||
return;
|
||||
}
|
||||
+
|
||||
+ if (!s->current_req) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
s->dma_left -= len;
|
||||
s->async_buf += len;
|
||||
s->async_len -= len;
|
||||
@@ -415,6 +420,9 @@ static void esp_do_dma(ESPState *s)
|
||||
do_cmd(s, s->cmdbuf);
|
||||
return;
|
||||
}
|
||||
+ if (!s->current_req) {
|
||||
+ return;
|
||||
+ }
|
||||
if (s->async_len == 0) {
|
||||
/* Defer until data is available. */
|
||||
return;
|
||||
42
meta/recipes-devtools/qemu/qemu/CVE-2020-35505.patch
Normal file
42
meta/recipes-devtools/qemu/qemu/CVE-2020-35505.patch
Normal file
@@ -0,0 +1,42 @@
|
||||
Backport of:
|
||||
|
||||
From 99545751734035b76bd372c4e7215bb337428d89 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
||||
Date: Wed, 7 Apr 2021 20:57:55 +0100
|
||||
Subject: [PATCH] esp: ensure cmdfifo is not empty and current_dev is non-NULL
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When about to execute a SCSI command, ensure that cmdfifo is not empty and
|
||||
current_dev is non-NULL. This can happen if the guest tries to execute a TI
|
||||
(Transfer Information) command without issuing one of the select commands
|
||||
first.
|
||||
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1910723
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1909247
|
||||
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Message-Id: <20210407195801.685-7-mark.cave-ayland@ilande.co.uk>
|
||||
|
||||
CVE: CVE-2020-35504
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2020-35505.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/99545751734035b76bd372c4e7215bb337428d89 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/scsi/esp.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/hw/scsi/esp.c
|
||||
+++ b/hw/scsi/esp.c
|
||||
@@ -193,6 +193,10 @@ static void do_busid_cmd(ESPState *s, ui
|
||||
|
||||
trace_esp_do_busid_cmd(busid);
|
||||
lun = busid & 7;
|
||||
+
|
||||
+ if (!s->current_dev) {
|
||||
+ return;
|
||||
+ }
|
||||
current_lun = scsi_device_find(&s->bus, 0, s->current_dev->id, lun);
|
||||
s->current_req = scsi_req_new(current_lun, 0, lun, buf, s);
|
||||
datalen = scsi_req_enqueue(s->current_req);
|
||||
85
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-1.patch
Normal file
85
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-1.patch
Normal file
@@ -0,0 +1,85 @@
|
||||
From b263d8f928001b5cfa2a993ea43b7a5b3a1811e8 Mon Sep 17 00:00:00 2001
|
||||
From: Bin Meng <bmeng.cn@gmail.com>
|
||||
Date: Wed, 3 Mar 2021 20:26:35 +0800
|
||||
Subject: [PATCH] hw/sd: sdhci: Don't transfer any data when command time out
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
At the end of sdhci_send_command(), it starts a data transfer if the
|
||||
command register indicates data is associated. But the data transfer
|
||||
should only be initiated when the command execution has succeeded.
|
||||
|
||||
With this fix, the following reproducer:
|
||||
|
||||
outl 0xcf8 0x80001810
|
||||
outl 0xcfc 0xe1068000
|
||||
outl 0xcf8 0x80001804
|
||||
outw 0xcfc 0x7
|
||||
write 0xe106802c 0x1 0x0f
|
||||
write 0xe1068004 0xc 0x2801d10101fffffbff28a384
|
||||
write 0xe106800c 0x1f 0x9dacbbcad9e8f7061524334251606f7e8d9cabbac9d8e7f60514233241505f
|
||||
write 0xe1068003 0x28 0x80d000251480d000252280d000253080d000253e80d000254c80d000255a80d000256880d0002576
|
||||
write 0xe1068003 0x1 0xfe
|
||||
|
||||
cannot be reproduced with the following QEMU command line:
|
||||
|
||||
$ qemu-system-x86_64 -nographic -M pc-q35-5.0 \
|
||||
-device sdhci-pci,sd-spec-version=3 \
|
||||
-drive if=sd,index=0,file=null-co://,format=raw,id=mydrive \
|
||||
-device sd-card,drive=mydrive \
|
||||
-monitor none -serial none -qtest stdio
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: CVE-2020-17380
|
||||
Fixes: CVE-2020-25085
|
||||
Fixes: CVE-2021-3409
|
||||
Fixes: d7dfca0807a0 ("hw/sdhci: introduce standard SD host controller")
|
||||
Reported-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Reported-by: Cornelius Aschermann (Ruhr-Universität Bochum)
|
||||
Reported-by: Sergej Schumilo (Ruhr-Universität Bochum)
|
||||
Reported-by: Simon Wörner (Ruhr-Universität Bochum)
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1892960
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1909418
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1928146
|
||||
Acked-by: Alistair Francis <alistair.francis@wdc.com>
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
|
||||
Message-Id: <20210303122639.20004-2-bmeng.cn@gmail.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
|
||||
CVE: CVE-2021-3409 CVE-2020-17380
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2021-3409-1.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/b263d8f928001b5cfa2a993ea43b7a5b3a1811e8 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/sd/sdhci.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/hw/sd/sdhci.c
|
||||
+++ b/hw/sd/sdhci.c
|
||||
@@ -316,6 +316,7 @@ static void sdhci_send_command(SDHCIStat
|
||||
SDRequest request;
|
||||
uint8_t response[16];
|
||||
int rlen;
|
||||
+ bool timeout = false;
|
||||
|
||||
s->errintsts = 0;
|
||||
s->acmd12errsts = 0;
|
||||
@@ -339,6 +340,7 @@ static void sdhci_send_command(SDHCIStat
|
||||
trace_sdhci_response16(s->rspreg[3], s->rspreg[2],
|
||||
s->rspreg[1], s->rspreg[0]);
|
||||
} else {
|
||||
+ timeout = true;
|
||||
trace_sdhci_error("timeout waiting for command response");
|
||||
if (s->errintstsen & SDHC_EISEN_CMDTIMEOUT) {
|
||||
s->errintsts |= SDHC_EIS_CMDTIMEOUT;
|
||||
@@ -359,7 +361,7 @@ static void sdhci_send_command(SDHCIStat
|
||||
|
||||
sdhci_update_irq(s);
|
||||
|
||||
- if (s->blksize && (s->cmdreg & SDHC_CMD_DATA_PRESENT)) {
|
||||
+ if (!timeout && s->blksize && (s->cmdreg & SDHC_CMD_DATA_PRESENT)) {
|
||||
s->data_count = 0;
|
||||
sdhci_data_transfer(s);
|
||||
}
|
||||
103
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-2.patch
Normal file
103
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-2.patch
Normal file
@@ -0,0 +1,103 @@
|
||||
From 8be45cc947832b3c02144c9d52921f499f2d77fe Mon Sep 17 00:00:00 2001
|
||||
From: Bin Meng <bmeng.cn@gmail.com>
|
||||
Date: Wed, 3 Mar 2021 20:26:36 +0800
|
||||
Subject: [PATCH] hw/sd: sdhci: Don't write to SDHC_SYSAD register when
|
||||
transfer is in progress
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Per "SD Host Controller Standard Specification Version 7.00"
|
||||
chapter 2.2.1 SDMA System Address Register:
|
||||
|
||||
This register can be accessed only if no transaction is executing
|
||||
(i.e., after a transaction has stopped).
|
||||
|
||||
With this fix, the following reproducer:
|
||||
|
||||
outl 0xcf8 0x80001010
|
||||
outl 0xcfc 0xfbefff00
|
||||
outl 0xcf8 0x80001001
|
||||
outl 0xcfc 0x06000000
|
||||
write 0xfbefff2c 0x1 0x05
|
||||
write 0xfbefff0f 0x1 0x37
|
||||
write 0xfbefff0a 0x1 0x01
|
||||
write 0xfbefff0f 0x1 0x29
|
||||
write 0xfbefff0f 0x1 0x02
|
||||
write 0xfbefff0f 0x1 0x03
|
||||
write 0xfbefff04 0x1 0x01
|
||||
write 0xfbefff05 0x1 0x01
|
||||
write 0xfbefff07 0x1 0x02
|
||||
write 0xfbefff0c 0x1 0x33
|
||||
write 0xfbefff0e 0x1 0x20
|
||||
write 0xfbefff0f 0x1 0x00
|
||||
write 0xfbefff2a 0x1 0x01
|
||||
write 0xfbefff0c 0x1 0x00
|
||||
write 0xfbefff03 0x1 0x00
|
||||
write 0xfbefff05 0x1 0x00
|
||||
write 0xfbefff2a 0x1 0x02
|
||||
write 0xfbefff0c 0x1 0x32
|
||||
write 0xfbefff01 0x1 0x01
|
||||
write 0xfbefff02 0x1 0x01
|
||||
write 0xfbefff03 0x1 0x01
|
||||
|
||||
cannot be reproduced with the following QEMU command line:
|
||||
|
||||
$ qemu-system-x86_64 -nographic -machine accel=qtest -m 512M \
|
||||
-nodefaults -device sdhci-pci,sd-spec-version=3 \
|
||||
-drive if=sd,index=0,file=null-co://,format=raw,id=mydrive \
|
||||
-device sd-card,drive=mydrive -qtest stdio
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: CVE-2020-17380
|
||||
Fixes: CVE-2020-25085
|
||||
Fixes: CVE-2021-3409
|
||||
Fixes: d7dfca0807a0 ("hw/sdhci: introduce standard SD host controller")
|
||||
Reported-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Reported-by: Cornelius Aschermann (Ruhr-Universität Bochum)
|
||||
Reported-by: Sergej Schumilo (Ruhr-Universität Bochum)
|
||||
Reported-by: Simon Wörner (Ruhr-Universität Bochum)
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1892960
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1909418
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1928146
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
|
||||
Message-Id: <20210303122639.20004-3-bmeng.cn@gmail.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
|
||||
CVE: CVE-2021-3409 CVE-2020-17380
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2021-3409-2.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/8be45cc947832b3c02144c9d52921f499f2d77fe ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/sd/sdhci.c | 20 +++++++++++---------
|
||||
1 file changed, 11 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/hw/sd/sdhci.c
|
||||
+++ b/hw/sd/sdhci.c
|
||||
@@ -1117,15 +1117,17 @@ sdhci_write(void *opaque, hwaddr offset,
|
||||
|
||||
switch (offset & ~0x3) {
|
||||
case SDHC_SYSAD:
|
||||
- s->sdmasysad = (s->sdmasysad & mask) | value;
|
||||
- MASKED_WRITE(s->sdmasysad, mask, value);
|
||||
- /* Writing to last byte of sdmasysad might trigger transfer */
|
||||
- if (!(mask & 0xFF000000) && TRANSFERRING_DATA(s->prnsts) && s->blkcnt &&
|
||||
- s->blksize && SDHC_DMA_TYPE(s->hostctl1) == SDHC_CTRL_SDMA) {
|
||||
- if (s->trnmod & SDHC_TRNS_MULTI) {
|
||||
- sdhci_sdma_transfer_multi_blocks(s);
|
||||
- } else {
|
||||
- sdhci_sdma_transfer_single_block(s);
|
||||
+ if (!TRANSFERRING_DATA(s->prnsts)) {
|
||||
+ s->sdmasysad = (s->sdmasysad & mask) | value;
|
||||
+ MASKED_WRITE(s->sdmasysad, mask, value);
|
||||
+ /* Writing to last byte of sdmasysad might trigger transfer */
|
||||
+ if (!(mask & 0xFF000000) && s->blkcnt && s->blksize &&
|
||||
+ SDHC_DMA_TYPE(s->hostctl1) == SDHC_CTRL_SDMA) {
|
||||
+ if (s->trnmod & SDHC_TRNS_MULTI) {
|
||||
+ sdhci_sdma_transfer_multi_blocks(s);
|
||||
+ } else {
|
||||
+ sdhci_sdma_transfer_single_block(s);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
break;
|
||||
71
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-3.patch
Normal file
71
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-3.patch
Normal file
@@ -0,0 +1,71 @@
|
||||
Backport of:
|
||||
|
||||
From bc6f28995ff88f5d82c38afcfd65406f0ae375aa Mon Sep 17 00:00:00 2001
|
||||
From: Bin Meng <bmeng.cn@gmail.com>
|
||||
Date: Wed, 3 Mar 2021 20:26:37 +0800
|
||||
Subject: [PATCH] hw/sd: sdhci: Correctly set the controller status for ADMA
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When an ADMA transfer is started, the codes forget to set the
|
||||
controller status to indicate a transfer is in progress.
|
||||
|
||||
With this fix, the following 2 reproducers:
|
||||
|
||||
https://paste.debian.net/plain/1185136
|
||||
https://paste.debian.net/plain/1185141
|
||||
|
||||
cannot be reproduced with the following QEMU command line:
|
||||
|
||||
$ qemu-system-x86_64 -nographic -machine accel=qtest -m 512M \
|
||||
-nodefaults -device sdhci-pci,sd-spec-version=3 \
|
||||
-drive if=sd,index=0,file=null-co://,format=raw,id=mydrive \
|
||||
-device sd-card,drive=mydrive -qtest stdio
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: CVE-2020-17380
|
||||
Fixes: CVE-2020-25085
|
||||
Fixes: CVE-2021-3409
|
||||
Fixes: d7dfca0807a0 ("hw/sdhci: introduce standard SD host controller")
|
||||
Reported-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Reported-by: Cornelius Aschermann (Ruhr-Universität Bochum)
|
||||
Reported-by: Sergej Schumilo (Ruhr-Universität Bochum)
|
||||
Reported-by: Simon Wörner (Ruhr-Universität Bochum)
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1892960
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1909418
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1928146
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
|
||||
Message-Id: <20210303122639.20004-4-bmeng.cn@gmail.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
|
||||
CVE: CVE-2021-3409 CVE-2020-17380
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2021-3409-3.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/bc6f28995ff88f5d82c38afcfd65406f0ae375aa ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/sd/sdhci.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/hw/sd/sdhci.c
|
||||
+++ b/hw/sd/sdhci.c
|
||||
@@ -776,8 +776,9 @@ static void sdhci_do_adma(SDHCIState *s)
|
||||
|
||||
switch (dscr.attr & SDHC_ADMA_ATTR_ACT_MASK) {
|
||||
case SDHC_ADMA_ATTR_ACT_TRAN: /* data transfer */
|
||||
-
|
||||
+ s->prnsts |= SDHC_DATA_INHIBIT | SDHC_DAT_LINE_ACTIVE;
|
||||
if (s->trnmod & SDHC_TRNS_READ) {
|
||||
+ s->prnsts |= SDHC_DOING_READ;
|
||||
while (length) {
|
||||
if (s->data_count == 0) {
|
||||
for (n = 0; n < block_size; n++) {
|
||||
@@ -807,6 +808,7 @@ static void sdhci_do_adma(SDHCIState *s)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
+ s->prnsts |= SDHC_DOING_WRITE;
|
||||
while (length) {
|
||||
begin = s->data_count;
|
||||
if ((length + begin) < block_size) {
|
||||
52
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-4.patch
Normal file
52
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-4.patch
Normal file
@@ -0,0 +1,52 @@
|
||||
Backport of:
|
||||
|
||||
From 5cd7aa3451b76bb19c0f6adc2b931f091e5d7fcd Mon Sep 17 00:00:00 2001
|
||||
From: Bin Meng <bmeng.cn@gmail.com>
|
||||
Date: Wed, 3 Mar 2021 20:26:38 +0800
|
||||
Subject: [PATCH] hw/sd: sdhci: Limit block size only when SDHC_BLKSIZE
|
||||
register is writable
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The codes to limit the maximum block size is only necessary when
|
||||
SDHC_BLKSIZE register is writable.
|
||||
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
|
||||
Message-Id: <20210303122639.20004-5-bmeng.cn@gmail.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
|
||||
CVE: CVE-2021-3409 CVE-2020-17380
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2021-3409-4.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/5cd7aa3451b76bb19c0f6adc2b931f091e5d7fcd ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/sd/sdhci.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/hw/sd/sdhci.c
|
||||
+++ b/hw/sd/sdhci.c
|
||||
@@ -1137,15 +1137,15 @@ sdhci_write(void *opaque, hwaddr offset,
|
||||
if (!TRANSFERRING_DATA(s->prnsts)) {
|
||||
MASKED_WRITE(s->blksize, mask, extract32(value, 0, 12));
|
||||
MASKED_WRITE(s->blkcnt, mask >> 16, value >> 16);
|
||||
- }
|
||||
|
||||
- /* Limit block size to the maximum buffer size */
|
||||
- if (extract32(s->blksize, 0, 12) > s->buf_maxsz) {
|
||||
- qemu_log_mask(LOG_GUEST_ERROR, "%s: Size 0x%x is larger than " \
|
||||
- "the maximum buffer 0x%x", __func__, s->blksize,
|
||||
- s->buf_maxsz);
|
||||
+ /* Limit block size to the maximum buffer size */
|
||||
+ if (extract32(s->blksize, 0, 12) > s->buf_maxsz) {
|
||||
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Size 0x%x is larger than "
|
||||
+ "the maximum buffer 0x%x\n", __func__, s->blksize,
|
||||
+ s->buf_maxsz);
|
||||
|
||||
- s->blksize = deposit32(s->blksize, 0, 12, s->buf_maxsz);
|
||||
+ s->blksize = deposit32(s->blksize, 0, 12, s->buf_maxsz);
|
||||
+ }
|
||||
}
|
||||
|
||||
break;
|
||||
93
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-5.patch
Normal file
93
meta/recipes-devtools/qemu/qemu/CVE-2021-3409-5.patch
Normal file
@@ -0,0 +1,93 @@
|
||||
From cffb446e8fd19a14e1634c7a3a8b07be3f01d5c9 Mon Sep 17 00:00:00 2001
|
||||
From: Bin Meng <bmeng.cn@gmail.com>
|
||||
Date: Wed, 3 Mar 2021 20:26:39 +0800
|
||||
Subject: [PATCH] hw/sd: sdhci: Reset the data pointer of s->fifo_buffer[] when
|
||||
a different block size is programmed
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If the block size is programmed to a different value from the
|
||||
previous one, reset the data pointer of s->fifo_buffer[] so that
|
||||
s->fifo_buffer[] can be filled in using the new block size in
|
||||
the next transfer.
|
||||
|
||||
With this fix, the following reproducer:
|
||||
|
||||
outl 0xcf8 0x80001010
|
||||
outl 0xcfc 0xe0000000
|
||||
outl 0xcf8 0x80001001
|
||||
outl 0xcfc 0x06000000
|
||||
write 0xe000002c 0x1 0x05
|
||||
write 0xe0000005 0x1 0x02
|
||||
write 0xe0000007 0x1 0x01
|
||||
write 0xe0000028 0x1 0x10
|
||||
write 0x0 0x1 0x23
|
||||
write 0x2 0x1 0x08
|
||||
write 0xe000000c 0x1 0x01
|
||||
write 0xe000000e 0x1 0x20
|
||||
write 0xe000000f 0x1 0x00
|
||||
write 0xe000000c 0x1 0x32
|
||||
write 0xe0000004 0x2 0x0200
|
||||
write 0xe0000028 0x1 0x00
|
||||
write 0xe0000003 0x1 0x40
|
||||
|
||||
cannot be reproduced with the following QEMU command line:
|
||||
|
||||
$ qemu-system-x86_64 -nographic -machine accel=qtest -m 512M \
|
||||
-nodefaults -device sdhci-pci,sd-spec-version=3 \
|
||||
-drive if=sd,index=0,file=null-co://,format=raw,id=mydrive \
|
||||
-device sd-card,drive=mydrive -qtest stdio
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: CVE-2020-17380
|
||||
Fixes: CVE-2020-25085
|
||||
Fixes: CVE-2021-3409
|
||||
Fixes: d7dfca0807a0 ("hw/sdhci: introduce standard SD host controller")
|
||||
Reported-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Reported-by: Cornelius Aschermann (Ruhr-Universität Bochum)
|
||||
Reported-by: Sergej Schumilo (Ruhr-Universität Bochum)
|
||||
Reported-by: Simon Wörner (Ruhr-Universität Bochum)
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1892960
|
||||
Buglink: https://bugs.launchpad.net/qemu/+bug/1909418
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1928146
|
||||
Tested-by: Alexander Bulekov <alxndr@bu.edu>
|
||||
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
|
||||
Message-Id: <20210303122639.20004-6-bmeng.cn@gmail.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
|
||||
CVE: CVE-2021-3409 CVE-2020-17380
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2021-3409-5.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/cffb446e8fd19a14e1634c7a3a8b07be3f01d5c9 ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/sd/sdhci.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/hw/sd/sdhci.c
|
||||
+++ b/hw/sd/sdhci.c
|
||||
@@ -1135,6 +1135,8 @@ sdhci_write(void *opaque, hwaddr offset,
|
||||
break;
|
||||
case SDHC_BLKSIZE:
|
||||
if (!TRANSFERRING_DATA(s->prnsts)) {
|
||||
+ uint16_t blksize = s->blksize;
|
||||
+
|
||||
MASKED_WRITE(s->blksize, mask, extract32(value, 0, 12));
|
||||
MASKED_WRITE(s->blkcnt, mask >> 16, value >> 16);
|
||||
|
||||
@@ -1146,6 +1148,16 @@ sdhci_write(void *opaque, hwaddr offset,
|
||||
|
||||
s->blksize = deposit32(s->blksize, 0, 12, s->buf_maxsz);
|
||||
}
|
||||
+
|
||||
+ /*
|
||||
+ * If the block size is programmed to a different value from
|
||||
+ * the previous one, reset the data pointer of s->fifo_buffer[]
|
||||
+ * so that s->fifo_buffer[] can be filled in using the new block
|
||||
+ * size in the next transfer.
|
||||
+ */
|
||||
+ if (blksize != s->blksize) {
|
||||
+ s->data_count = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1,7 +1,8 @@
|
||||
From 736b01642d85be832385063f278fe7cd4ffb5221 Mon Sep 17 00:00:00 2001
|
||||
From: Klaus Jensen <k.jensen@samsung.com>
|
||||
Date: Fri, 17 Dec 2021 10:44:01 +0100
|
||||
Subject: [PATCH] hw/nvme: fix CVE-2021-3929
|
||||
From 2c682b5975b41495f98cc34b8243042c446eec44 Mon Sep 17 00:00:00 2001
|
||||
From: Gaurav Gupta <gauragup@cisco.com>
|
||||
Date: Wed, 29 Mar 2023 14:36:16 -0700
|
||||
Subject: [PATCH] hw/nvme: fix CVE-2021-3929 MIME-Version: 1.0 Content-Type:
|
||||
text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@@ -17,21 +18,23 @@ Reviewed-by: Keith Busch <kbusch@kernel.org>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/736b01642d85be832385]
|
||||
Upstream-Status: Backport
|
||||
[https://gitlab.com/qemu-project/qemu/-/commit/736b01642d85be832385]
|
||||
CVE: CVE-2021-3929
|
||||
Signed-off-by: Vivek Kumbhar <vkumbhar@mvista.com>
|
||||
Signed-off-by: Gaurav Gupta <gauragup@cisco.com>
|
||||
---
|
||||
hw/block/nvme.c | 23 +++++++++++++++++++++++
|
||||
hw/block/nvme.h | 1 +
|
||||
2 files changed, 24 insertions(+)
|
||||
|
||||
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
|
||||
index 12d82542..e7d0750c 100644
|
||||
index bda446d..ae9b19f 100644
|
||||
--- a/hw/block/nvme.c
|
||||
+++ b/hw/block/nvme.c
|
||||
@@ -52,8 +52,31 @@
|
||||
|
||||
static void nvme_process_sq(void *opaque);
|
||||
@@ -60,8 +60,31 @@ static bool nvme_addr_is_cmb(NvmeCtrl *n, hwaddr addr)
|
||||
return addr >= low && addr < hi;
|
||||
}
|
||||
|
||||
+static inline bool nvme_addr_is_iomem(NvmeCtrl *n, hwaddr addr)
|
||||
+{
|
||||
@@ -51,18 +54,18 @@ index 12d82542..e7d0750c 100644
|
||||
+ return addr >= lo && addr < hi;
|
||||
+}
|
||||
+
|
||||
static void nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size)
|
||||
static int nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size)
|
||||
{
|
||||
+
|
||||
+ if (nvme_addr_is_iomem(n, addr)) {
|
||||
+ return NVME_DATA_TRAS_ERROR;
|
||||
+ return NVME_DATA_TRAS_ERROR;
|
||||
+ }
|
||||
+
|
||||
if (n->cmbsz && addr >= n->ctrl_mem.addr &&
|
||||
addr < (n->ctrl_mem.addr + int128_get64(n->ctrl_mem.size))) {
|
||||
if (n->cmbsz && nvme_addr_is_cmb(n, addr)) {
|
||||
memcpy(buf, (void *)&n->cmbuf[addr - n->ctrl_mem.addr], size);
|
||||
return 0;
|
||||
diff --git a/hw/block/nvme.h b/hw/block/nvme.h
|
||||
index 557194ee..5a2b119c 100644
|
||||
index 557194e..5a2b119 100644
|
||||
--- a/hw/block/nvme.h
|
||||
+++ b/hw/block/nvme.h
|
||||
@@ -59,6 +59,7 @@ typedef struct NvmeNamespace {
|
||||
@@ -74,5 +77,5 @@ index 557194ee..5a2b119c 100644
|
||||
MemoryRegion ctrl_mem;
|
||||
NvmeBar bar;
|
||||
--
|
||||
2.30.2
|
||||
1.8.3.1
|
||||
|
||||
|
||||
57
meta/recipes-devtools/qemu/qemu/CVE-2022-26354.patch
Normal file
57
meta/recipes-devtools/qemu/qemu/CVE-2022-26354.patch
Normal file
@@ -0,0 +1,57 @@
|
||||
Backport of:
|
||||
|
||||
From 8d1b247f3748ac4078524130c6d7ae42b6140aaf Mon Sep 17 00:00:00 2001
|
||||
From: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Date: Mon, 28 Feb 2022 10:50:58 +0100
|
||||
Subject: [PATCH] vhost-vsock: detach the virqueue element in case of error
|
||||
|
||||
In vhost_vsock_common_send_transport_reset(), if an element popped from
|
||||
the virtqueue is invalid, we should call virtqueue_detach_element() to
|
||||
detach it from the virtqueue before freeing its memory.
|
||||
|
||||
Fixes: fc0b9b0e1c ("vhost-vsock: add virtio sockets device")
|
||||
Fixes: CVE-2022-26354
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Reported-by: VictorV <vv474172261@gmail.com>
|
||||
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
Message-Id: <20220228095058.27899-1-sgarzare@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
CVE: CVE-2022-26354
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/qemu/tree/debian/patches/CVE-2022-26354.patch?h=ubuntu/focal-security Upstream commit https://github.com/qemu/qemu/commit/8d1b247f3748ac4078524130c6d7ae42b6140aaf ]
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
hw/virtio/vhost-vsock-common.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/hw/virtio/vhost-vsock.c
|
||||
+++ b/hw/virtio/vhost-vsock.c
|
||||
@@ -221,19 +221,23 @@ static void vhost_vsock_send_transport_r
|
||||
if (elem->out_num) {
|
||||
error_report("invalid vhost-vsock event virtqueue element with "
|
||||
"out buffers");
|
||||
- goto out;
|
||||
+ goto err;
|
||||
}
|
||||
|
||||
if (iov_from_buf(elem->in_sg, elem->in_num, 0,
|
||||
&event, sizeof(event)) != sizeof(event)) {
|
||||
error_report("vhost-vsock event virtqueue element is too short");
|
||||
- goto out;
|
||||
+ goto err;
|
||||
}
|
||||
|
||||
virtqueue_push(vq, elem, sizeof(event));
|
||||
virtio_notify(VIRTIO_DEVICE(vsock), vq);
|
||||
|
||||
-out:
|
||||
+ g_free(elem);
|
||||
+ return;
|
||||
+
|
||||
+err:
|
||||
+ virtqueue_detach_element(vq, elem, 0);
|
||||
g_free(elem);
|
||||
}
|
||||
|
||||
103
meta/recipes-devtools/qemu/qemu/CVE-2022-4144.patch
Normal file
103
meta/recipes-devtools/qemu/qemu/CVE-2022-4144.patch
Normal file
@@ -0,0 +1,103 @@
|
||||
From 6dbbf055148c6f1b7d8a3251a65bd6f3d1e1f622 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@linaro.org>
|
||||
Date: Mon, 28 Nov 2022 21:27:40 +0100
|
||||
Subject: [PATCH] hw/display/qxl: Avoid buffer overrun in qxl_phys2virt
|
||||
(CVE-2022-4144)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Have qxl_get_check_slot_offset() return false if the requested
|
||||
buffer size does not fit within the slot memory region.
|
||||
|
||||
Similarly qxl_phys2virt() now returns NULL in such case, and
|
||||
qxl_dirty_one_surface() aborts.
|
||||
|
||||
This avoids buffer overrun in the host pointer returned by
|
||||
memory_region_get_ram_ptr().
|
||||
|
||||
Fixes: CVE-2022-4144 (out-of-bounds read)
|
||||
Reported-by: Wenxu Yin (@awxylitol)
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1336
|
||||
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20221128202741.4945-5-philmd@linaro.org>
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/6dbbf055148c6f1b7d8a3251a65bd6f3d1e1f622]
|
||||
CVE: CVE-2022-4144
|
||||
Comments: Deleted patch hunk in qxl.h,as it contains change
|
||||
in comments which is not present in current version of qemu.
|
||||
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
hw/display/qxl.c | 27 +++++++++++++++++++++++----
|
||||
1 file changed, 23 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||
index cd7eb39d..6bc8385b 100644
|
||||
--- a/hw/display/qxl.c
|
||||
+++ b/hw/display/qxl.c
|
||||
@@ -1440,11 +1440,13 @@ static void qxl_reset_surfaces(PCIQXLDevice *d)
|
||||
|
||||
/* can be also called from spice server thread context */
|
||||
static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||
- uint32_t *s, uint64_t *o)
|
||||
+ uint32_t *s, uint64_t *o,
|
||||
+ size_t size_requested)
|
||||
{
|
||||
uint64_t phys = le64_to_cpu(pqxl);
|
||||
uint32_t slot = (phys >> (64 - 8)) & 0xff;
|
||||
uint64_t offset = phys & 0xffffffffffff;
|
||||
+ uint64_t size_available;
|
||||
|
||||
if (slot >= NUM_MEMSLOTS) {
|
||||
qxl_set_guest_bug(qxl, "slot too large %d >= %d", slot,
|
||||
@@ -1468,6 +1470,23 @@ static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||
slot, offset, qxl->guest_slots[slot].size);
|
||||
return false;
|
||||
}
|
||||
+ size_available = memory_region_size(qxl->guest_slots[slot].mr);
|
||||
+ if (qxl->guest_slots[slot].offset + offset >= size_available) {
|
||||
+ qxl_set_guest_bug(qxl,
|
||||
+ "slot %d offset %"PRIu64" > region size %"PRIu64"\n",
|
||||
+ slot, qxl->guest_slots[slot].offset + offset,
|
||||
+ size_available);
|
||||
+ return false;
|
||||
+ }
|
||||
+ size_available -= qxl->guest_slots[slot].offset + offset;
|
||||
+ if (size_requested > size_available) {
|
||||
+ qxl_set_guest_bug(qxl,
|
||||
+ "slot %d offset %"PRIu64" size %zu: "
|
||||
+ "overrun by %"PRIu64" bytes\n",
|
||||
+ slot, offset, size_requested,
|
||||
+ size_requested - size_available);
|
||||
+ return false;
|
||||
+ }
|
||||
|
||||
*s = slot;
|
||||
*o = offset;
|
||||
@@ -1486,7 +1505,7 @@ void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id)
|
||||
offset = le64_to_cpu(pqxl) & 0xffffffffffff;
|
||||
return (void *)(intptr_t)offset;
|
||||
case MEMSLOT_GROUP_GUEST:
|
||||
- if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset)) {
|
||||
+ if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size)) {
|
||||
return NULL;
|
||||
}
|
||||
ptr = memory_region_get_ram_ptr(qxl->guest_slots[slot].mr);
|
||||
@@ -1944,9 +1963,9 @@ static void qxl_dirty_one_surface(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||
uint32_t slot;
|
||||
bool rc;
|
||||
|
||||
- rc = qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset);
|
||||
- assert(rc == true);
|
||||
size = (uint64_t)height * abs(stride);
|
||||
+ rc = qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size);
|
||||
+ assert(rc == true);
|
||||
trace_qxl_surfaces_dirty(qxl->id, offset, size);
|
||||
qxl_set_dirty(qxl->guest_slots[slot].mr,
|
||||
qxl->guest_slots[slot].offset + offset,
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
From ea2a7c7676d8eb9d1458eaa4b717df46782dcb3a Mon Sep 17 00:00:00 2001
|
||||
From: Gaurav Gupta <gauragup@cisco.com>
|
||||
Date: Wed, 29 Mar 2023 14:07:17 -0700
|
||||
Subject: [PATCH 2/2] hw/block/nvme: handle dma errors
|
||||
|
||||
Handling DMA errors gracefully is required for the device to pass the
|
||||
block/011 test ("disable PCI device while doing I/O") in the blktests
|
||||
suite.
|
||||
|
||||
With this patch the device sets the Controller Fatal Status bit in the
|
||||
CSTS register when failing to read from a submission queue or writing to
|
||||
a completion queue; expecting the host to reset the controller.
|
||||
|
||||
If DMA errors occur at any other point in the execution of the command
|
||||
(say, while mapping the PRPs), the command is aborted with a Data
|
||||
Transfer Error status code.
|
||||
|
||||
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
|
||||
Signed-off-by: Gaurav Gupta <gauragup@cisco.com>
|
||||
---
|
||||
hw/block/nvme.c | 41 +++++++++++++++++++++++++++++++----------
|
||||
hw/block/trace-events | 3 +++
|
||||
2 files changed, 34 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
|
||||
index e6f24a6..bda446d 100644
|
||||
--- a/hw/block/nvme.c
|
||||
+++ b/hw/block/nvme.c
|
||||
@@ -60,14 +60,14 @@ static bool nvme_addr_is_cmb(NvmeCtrl *n, hwaddr addr)
|
||||
return addr >= low && addr < hi;
|
||||
}
|
||||
|
||||
-static void nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size)
|
||||
+static int nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size)
|
||||
{
|
||||
if (n->cmbsz && nvme_addr_is_cmb(n, addr)) {
|
||||
memcpy(buf, (void *)&n->cmbuf[addr - n->ctrl_mem.addr], size);
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
- pci_dma_read(&n->parent_obj, addr, buf, size);
|
||||
+ return pci_dma_read(&n->parent_obj, addr, buf, size);
|
||||
}
|
||||
|
||||
static int nvme_check_sqid(NvmeCtrl *n, uint16_t sqid)
|
||||
@@ -152,6 +152,7 @@ static uint16_t nvme_map_prp(QEMUSGList *qsg, QEMUIOVector *iov, uint64_t prp1,
|
||||
hwaddr trans_len = n->page_size - (prp1 % n->page_size);
|
||||
trans_len = MIN(len, trans_len);
|
||||
int num_prps = (len >> n->page_bits) + 1;
|
||||
+ int ret;
|
||||
|
||||
if (unlikely(!prp1)) {
|
||||
trace_nvme_err_invalid_prp();
|
||||
@@ -178,7 +179,11 @@ static uint16_t nvme_map_prp(QEMUSGList *qsg, QEMUIOVector *iov, uint64_t prp1,
|
||||
|
||||
nents = (len + n->page_size - 1) >> n->page_bits;
|
||||
prp_trans = MIN(n->max_prp_ents, nents) * sizeof(uint64_t);
|
||||
- nvme_addr_read(n, prp2, (void *)prp_list, prp_trans);
|
||||
+ ret = nvme_addr_read(n, prp2, (void *)prp_list, prp_trans);
|
||||
+ if (ret) {
|
||||
+ trace_pci_nvme_err_addr_read(prp2);
|
||||
+ return NVME_DATA_TRAS_ERROR;
|
||||
+ }
|
||||
while (len != 0) {
|
||||
uint64_t prp_ent = le64_to_cpu(prp_list[i]);
|
||||
|
||||
@@ -191,8 +196,12 @@ static uint16_t nvme_map_prp(QEMUSGList *qsg, QEMUIOVector *iov, uint64_t prp1,
|
||||
i = 0;
|
||||
nents = (len + n->page_size - 1) >> n->page_bits;
|
||||
prp_trans = MIN(n->max_prp_ents, nents) * sizeof(uint64_t);
|
||||
- nvme_addr_read(n, prp_ent, (void *)prp_list,
|
||||
- prp_trans);
|
||||
+ ret = nvme_addr_read(n, prp_ent, (void *)prp_list,
|
||||
+ prp_trans);
|
||||
+ if (ret) {
|
||||
+ trace_pci_nvme_err_addr_read(prp_ent);
|
||||
+ return NVME_DATA_TRAS_ERROR;
|
||||
+ }
|
||||
prp_ent = le64_to_cpu(prp_list[i]);
|
||||
}
|
||||
|
||||
@@ -286,6 +295,7 @@ static void nvme_post_cqes(void *opaque)
|
||||
NvmeCQueue *cq = opaque;
|
||||
NvmeCtrl *n = cq->ctrl;
|
||||
NvmeRequest *req, *next;
|
||||
+ int ret;
|
||||
|
||||
QTAILQ_FOREACH_SAFE(req, &cq->req_list, entry, next) {
|
||||
NvmeSQueue *sq;
|
||||
@@ -295,15 +305,21 @@ static void nvme_post_cqes(void *opaque)
|
||||
break;
|
||||
}
|
||||
|
||||
- QTAILQ_REMOVE(&cq->req_list, req, entry);
|
||||
sq = req->sq;
|
||||
req->cqe.status = cpu_to_le16((req->status << 1) | cq->phase);
|
||||
req->cqe.sq_id = cpu_to_le16(sq->sqid);
|
||||
req->cqe.sq_head = cpu_to_le16(sq->head);
|
||||
addr = cq->dma_addr + cq->tail * n->cqe_size;
|
||||
+ ret = pci_dma_write(&n->parent_obj, addr, (void *)&req->cqe,
|
||||
+ sizeof(req->cqe));
|
||||
+ if (ret) {
|
||||
+ trace_pci_nvme_err_addr_write(addr);
|
||||
+ trace_pci_nvme_err_cfs();
|
||||
+ n->bar.csts = NVME_CSTS_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
+ QTAILQ_REMOVE(&cq->req_list, req, entry);
|
||||
nvme_inc_cq_tail(cq);
|
||||
- pci_dma_write(&n->parent_obj, addr, (void *)&req->cqe,
|
||||
- sizeof(req->cqe));
|
||||
QTAILQ_INSERT_TAIL(&sq->req_list, req, entry);
|
||||
}
|
||||
if (cq->tail != cq->head) {
|
||||
@@ -888,7 +904,12 @@ static void nvme_process_sq(void *opaque)
|
||||
|
||||
while (!(nvme_sq_empty(sq) || QTAILQ_EMPTY(&sq->req_list))) {
|
||||
addr = sq->dma_addr + sq->head * n->sqe_size;
|
||||
- nvme_addr_read(n, addr, (void *)&cmd, sizeof(cmd));
|
||||
+ if (nvme_addr_read(n, addr, (void *)&cmd, sizeof(cmd))) {
|
||||
+ trace_pci_nvme_err_addr_read(addr);
|
||||
+ trace_pci_nvme_err_cfs();
|
||||
+ n->bar.csts = NVME_CSTS_FAILED;
|
||||
+ break;
|
||||
+ }
|
||||
nvme_inc_sq_head(sq);
|
||||
|
||||
req = QTAILQ_FIRST(&sq->req_list);
|
||||
diff --git a/hw/block/trace-events b/hw/block/trace-events
|
||||
index c03e80c..4e4ad4e 100644
|
||||
--- a/hw/block/trace-events
|
||||
+++ b/hw/block/trace-events
|
||||
@@ -60,6 +60,9 @@ nvme_mmio_shutdown_set(void) "shutdown bit set"
|
||||
nvme_mmio_shutdown_cleared(void) "shutdown bit cleared"
|
||||
|
||||
# nvme traces for error conditions
|
||||
+pci_nvme_err_addr_read(uint64_t addr) "addr 0x%"PRIx64""
|
||||
+pci_nvme_err_addr_write(uint64_t addr) "addr 0x%"PRIx64""
|
||||
+pci_nvme_err_cfs(void) "controller fatal status"
|
||||
nvme_err_invalid_dma(void) "PRP/SGL is too small for transfer size"
|
||||
nvme_err_invalid_prplist_ent(uint64_t prplist) "PRP list entry is null or not page aligned: 0x%"PRIx64""
|
||||
nvme_err_invalid_prp2_align(uint64_t prp2) "PRP2 is not page aligned: 0x%"PRIx64""
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
From 55428706d5b0b8889b8e009eac77137bb556a4f0 Mon Sep 17 00:00:00 2001
|
||||
From: Klaus Jensen <k.jensen@samsung.com>
|
||||
Date: Tue, 9 Jun 2020 21:03:17 +0200
|
||||
Subject: [PATCH 1/2] hw/block/nvme: refactor nvme_addr_read
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Pull the controller memory buffer check to its own function. The check
|
||||
will be used on its own in later patches.
|
||||
|
||||
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
|
||||
Reviewed-by: Keith Busch <kbusch@kernel.org>
|
||||
Message-Id: <20200609190333.59390-7-its@irrelevant.dk>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
hw/block/nvme.c | 16 ++++++++++++----
|
||||
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
|
||||
index 12d8254..e6f24a6 100644
|
||||
--- a/hw/block/nvme.c
|
||||
+++ b/hw/block/nvme.c
|
||||
@@ -52,14 +52,22 @@
|
||||
|
||||
static void nvme_process_sq(void *opaque);
|
||||
|
||||
+static bool nvme_addr_is_cmb(NvmeCtrl *n, hwaddr addr)
|
||||
+{
|
||||
+ hwaddr low = n->ctrl_mem.addr;
|
||||
+ hwaddr hi = n->ctrl_mem.addr + int128_get64(n->ctrl_mem.size);
|
||||
+
|
||||
+ return addr >= low && addr < hi;
|
||||
+}
|
||||
+
|
||||
static void nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size)
|
||||
{
|
||||
- if (n->cmbsz && addr >= n->ctrl_mem.addr &&
|
||||
- addr < (n->ctrl_mem.addr + int128_get64(n->ctrl_mem.size))) {
|
||||
+ if (n->cmbsz && nvme_addr_is_cmb(n, addr)) {
|
||||
memcpy(buf, (void *)&n->cmbuf[addr - n->ctrl_mem.addr], size);
|
||||
- } else {
|
||||
- pci_dma_read(&n->parent_obj, addr, buf, size);
|
||||
+ return;
|
||||
}
|
||||
+
|
||||
+ pci_dma_read(&n->parent_obj, addr, buf, size);
|
||||
}
|
||||
|
||||
static int nvme_check_sqid(NvmeCtrl *n, uint16_t sqid)
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@@ -0,0 +1,236 @@
|
||||
From 5a44a01c9eca6507be45d107c27377a3e8d0ee8c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@linaro.org>
|
||||
Date: Mon, 28 Nov 2022 21:27:39 +0100
|
||||
Subject: [PATCH] hw/display/qxl: Pass requested buffer size to qxl_phys2virt()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Currently qxl_phys2virt() doesn't check for buffer overrun.
|
||||
In order to do so in the next commit, pass the buffer size
|
||||
as argument.
|
||||
|
||||
For QXLCursor in qxl_render_cursor() -> qxl_cursor() we
|
||||
verify the size of the chunked data ahead, checking we can
|
||||
access 'sizeof(QXLCursor) + chunk->data_size' bytes.
|
||||
Since in the SPICE_CURSOR_TYPE_MONO case the cursor is
|
||||
assumed to fit in one chunk, no change are required.
|
||||
In SPICE_CURSOR_TYPE_ALPHA the ahead read is handled in
|
||||
qxl_unpack_chunks().
|
||||
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20221128202741.4945-4-philmd@linaro.org>
|
||||
|
||||
Backport and rebase patch to fix compile error which imported by CVE-2022-4144.patch:
|
||||
|
||||
/qxl.c: In function 'qxl_phys2virt':
|
||||
| /home/hitendra/work/yocto-work/cgx-data/dunfell-3.1/x86-generic-64-5.4-3.1-cgx/project/tmp/work/i586-montavistamllib32-linux/lib32-qemu/4.2.0-r0.8/qemu-4.2.0/hw/display/qxl.c:1508:67: error: 'size' undeclared (first use in this function); did you mean 'gsize'?
|
||||
| 1508 | if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size)) {
|
||||
| | ^~~~
|
||||
| | gsize
|
||||
|
||||
Upstream-Status: Backport [https://github.com/qemu/qemu/commit/61c34fc && https://gitlab.com/qemu-project/qemu/-/commit/8efec0ef8bbc1e75a7ebf6e325a35806ece9b39f]
|
||||
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
hw/display/qxl-logger.c | 22 +++++++++++++++++++---
|
||||
hw/display/qxl-render.c | 20 ++++++++++++++++----
|
||||
hw/display/qxl.c | 17 +++++++++++------
|
||||
hw/display/qxl.h | 3 ++-
|
||||
4 files changed, 48 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/hw/display/qxl-logger.c b/hw/display/qxl-logger.c
|
||||
index 2ec6d8fa..031ddfec 100644
|
||||
--- a/hw/display/qxl-logger.c
|
||||
+++ b/hw/display/qxl-logger.c
|
||||
@@ -106,7 +106,7 @@ static int qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL addr, int group_id)
|
||||
QXLImage *image;
|
||||
QXLImageDescriptor *desc;
|
||||
|
||||
- image = qxl_phys2virt(qxl, addr, group_id);
|
||||
+ image = qxl_phys2virt(qxl, addr, group_id, sizeof(QXLImage));
|
||||
if (!image) {
|
||||
return 1;
|
||||
}
|
||||
@@ -216,7 +216,8 @@ int qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id)
|
||||
cmd->u.set.position.y,
|
||||
cmd->u.set.visible ? "yes" : "no",
|
||||
cmd->u.set.shape);
|
||||
- cursor = qxl_phys2virt(qxl, cmd->u.set.shape, group_id);
|
||||
+ cursor = qxl_phys2virt(qxl, cmd->u.set.shape, group_id,
|
||||
+ sizeof(QXLCursor));
|
||||
if (!cursor) {
|
||||
return 1;
|
||||
}
|
||||
@@ -238,6 +239,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||
{
|
||||
bool compat = ext->flags & QXL_COMMAND_FLAG_COMPAT;
|
||||
void *data;
|
||||
+ size_t datasz;
|
||||
int ret;
|
||||
|
||||
if (!qxl->cmdlog) {
|
||||
@@ -249,7 +251,20 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||
qxl_name(qxl_type, ext->cmd.type),
|
||||
compat ? "(compat)" : "");
|
||||
|
||||
- data = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||
+ switch (ext->cmd.type) {
|
||||
+ case QXL_CMD_DRAW:
|
||||
+ datasz = compat ? sizeof(QXLCompatDrawable) : sizeof(QXLDrawable);
|
||||
+ break;
|
||||
+ case QXL_CMD_SURFACE:
|
||||
+ datasz = sizeof(QXLSurfaceCmd);
|
||||
+ break;
|
||||
+ case QXL_CMD_CURSOR:
|
||||
+ datasz = sizeof(QXLCursorCmd);
|
||||
+ break;
|
||||
+ default:
|
||||
+ goto out;
|
||||
+ }
|
||||
+ data = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id, datasz);
|
||||
if (!data) {
|
||||
return 1;
|
||||
}
|
||||
@@ -271,6 +286,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
|
||||
qxl_log_cmd_cursor(qxl, data, ext->group_id);
|
||||
break;
|
||||
}
|
||||
+out:
|
||||
fprintf(stderr, "\n");
|
||||
return 0;
|
||||
}
|
||||
diff --git a/hw/display/qxl-render.c b/hw/display/qxl-render.c
|
||||
index d532e157..a65a6d64 100644
|
||||
--- a/hw/display/qxl-render.c
|
||||
+++ b/hw/display/qxl-render.c
|
||||
@@ -107,7 +107,9 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
|
||||
qxl->guest_primary.resized = 0;
|
||||
qxl->guest_primary.data = qxl_phys2virt(qxl,
|
||||
qxl->guest_primary.surface.mem,
|
||||
- MEMSLOT_GROUP_GUEST);
|
||||
+ MEMSLOT_GROUP_GUEST,
|
||||
+ qxl->guest_primary.abs_stride
|
||||
+ * height);
|
||||
if (!qxl->guest_primary.data) {
|
||||
return;
|
||||
}
|
||||
@@ -222,7 +224,8 @@ static void qxl_unpack_chunks(void *dest, size_t size, PCIQXLDevice *qxl,
|
||||
if (offset == size) {
|
||||
return;
|
||||
}
|
||||
- chunk = qxl_phys2virt(qxl, chunk->next_chunk, group_id);
|
||||
+ chunk = qxl_phys2virt(qxl, chunk->next_chunk, group_id,
|
||||
+ sizeof(QXLDataChunk) + chunk->data_size);
|
||||
if (!chunk) {
|
||||
return;
|
||||
}
|
||||
@@ -289,7 +292,8 @@ fail:
|
||||
/* called from spice server thread context only */
|
||||
int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
||||
{
|
||||
- QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||
+ QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||
+ sizeof(QXLCursorCmd));
|
||||
QXLCursor *cursor;
|
||||
QEMUCursor *c;
|
||||
|
||||
@@ -308,7 +312,15 @@ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
||||
}
|
||||
switch (cmd->type) {
|
||||
case QXL_CURSOR_SET:
|
||||
- cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id);
|
||||
+ /* First read the QXLCursor to get QXLDataChunk::data_size ... */
|
||||
+ cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id,
|
||||
+ sizeof(QXLCursor));
|
||||
+ if (!cursor) {
|
||||
+ return 1;
|
||||
+ }
|
||||
+ /* Then read including the chunked data following QXLCursor. */
|
||||
+ cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id,
|
||||
+ sizeof(QXLCursor) + cursor->chunk.data_size);
|
||||
if (!cursor) {
|
||||
return 1;
|
||||
}
|
||||
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||
index 6bc8385b..858d3e93 100644
|
||||
--- a/hw/display/qxl.c
|
||||
+++ b/hw/display/qxl.c
|
||||
@@ -275,7 +275,8 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
|
||||
QXL_IO_MONITORS_CONFIG_ASYNC));
|
||||
}
|
||||
|
||||
- cfg = qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_GUEST);
|
||||
+ cfg = qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_GUEST,
|
||||
+ sizeof(QXLMonitorsConfig));
|
||||
if (cfg != NULL && cfg->count == 1) {
|
||||
qxl->guest_primary.resized = 1;
|
||||
qxl->guest_head0_width = cfg->heads[0].width;
|
||||
@@ -460,7 +461,8 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
|
||||
switch (le32_to_cpu(ext->cmd.type)) {
|
||||
case QXL_CMD_SURFACE:
|
||||
{
|
||||
- QXLSurfaceCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||
+ QXLSurfaceCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||
+ sizeof(QXLSurfaceCmd));
|
||||
|
||||
if (!cmd) {
|
||||
return 1;
|
||||
@@ -494,7 +496,8 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
|
||||
}
|
||||
case QXL_CMD_CURSOR:
|
||||
{
|
||||
- QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||
+ QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||
+ sizeof(QXLCursorCmd));
|
||||
|
||||
if (!cmd) {
|
||||
return 1;
|
||||
@@ -674,7 +677,8 @@ static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
|
||||
*
|
||||
* https://cgit.freedesktop.org/spice/win32/qxl-wddm-dod/commit/?id=f6e099db39e7d0787f294d5fd0dce328b5210faa
|
||||
*/
|
||||
- void *msg = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||
+ void *msg = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id,
|
||||
+ sizeof(QXLCommandRing));
|
||||
if (msg != NULL && (
|
||||
msg < (void *)qxl->vga.vram_ptr ||
|
||||
msg > ((void *)qxl->vga.vram_ptr + qxl->vga.vram_size))) {
|
||||
@@ -1494,7 +1498,8 @@ static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
|
||||
}
|
||||
|
||||
/* can be also called from spice server thread context */
|
||||
-void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id)
|
||||
+void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id,
|
||||
+ size_t size)
|
||||
{
|
||||
uint64_t offset;
|
||||
uint32_t slot;
|
||||
@@ -1994,7 +1999,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
|
||||
}
|
||||
|
||||
cmd = qxl_phys2virt(qxl, qxl->guest_surfaces.cmds[i],
|
||||
- MEMSLOT_GROUP_GUEST);
|
||||
+ MEMSLOT_GROUP_GUEST, sizeof(QXLSurfaceCmd));
|
||||
assert(cmd);
|
||||
assert(cmd->type == QXL_SURFACE_CMD_CREATE);
|
||||
qxl_dirty_one_surface(qxl, cmd->u.surface_create.data,
|
||||
diff --git a/hw/display/qxl.h b/hw/display/qxl.h
|
||||
index 80eb0d26..fcfd133a 100644
|
||||
--- a/hw/display/qxl.h
|
||||
+++ b/hw/display/qxl.h
|
||||
@@ -147,7 +147,8 @@ typedef struct PCIQXLDevice {
|
||||
#define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V12
|
||||
|
||||
/* qxl.c */
|
||||
-void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);
|
||||
+void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id,
|
||||
+ size_t size);
|
||||
void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...)
|
||||
GCC_FMT_ATTR(2, 3);
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
61
meta/recipes-devtools/ruby/ruby/CVE-2023-28756.patch
Normal file
61
meta/recipes-devtools/ruby/ruby/CVE-2023-28756.patch
Normal file
@@ -0,0 +1,61 @@
|
||||
From 957bb7cb81995f26c671afce0ee50a5c660e540e Mon Sep 17 00:00:00 2001
|
||||
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||
Date: Wed, 29 Mar 2023 13:28:25 +0900
|
||||
Subject: [PATCH] CVE-2023-28756
|
||||
|
||||
CVE: CVE-2023-28756
|
||||
Upstream-Status: Backport [https://github.com/ruby/ruby/commit/957bb7cb81995f26c671afce0ee50a5c660e540e]
|
||||
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
lib/time.rb | 6 +++---
|
||||
test/test_time.rb | 9 +++++++++
|
||||
2 files changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib/time.rb b/lib/time.rb
|
||||
index f27bacd..4a86e8e 100644
|
||||
--- a/lib/time.rb
|
||||
+++ b/lib/time.rb
|
||||
@@ -501,8 +501,8 @@ class Time
|
||||
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
|
||||
(\d{2,})\s+
|
||||
(\d{2})\s*
|
||||
- :\s*(\d{2})\s*
|
||||
- (?::\s*(\d{2}))?\s+
|
||||
+ :\s*(\d{2})
|
||||
+ (?:\s*:\s*(\d\d))?\s+
|
||||
([+-]\d{4}|
|
||||
UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
|
||||
# Since RFC 2822 permit comments, the regexp has no right anchor.
|
||||
@@ -717,7 +717,7 @@ class Time
|
||||
#
|
||||
# If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
|
||||
#
|
||||
- # +fractional_digits+ specifies a number of digits to use for fractional
|
||||
+ # +fraction_digits+ specifies a number of digits to use for fractional
|
||||
# seconds. Its default value is 0.
|
||||
#
|
||||
# require 'time'
|
||||
diff --git a/test/test_time.rb b/test/test_time.rb
|
||||
index ca20788..4f11048 100644
|
||||
--- a/test/test_time.rb
|
||||
+++ b/test/test_time.rb
|
||||
@@ -62,6 +62,15 @@ class TestTimeExtension < Test::Unit::TestCase # :nodoc:
|
||||
assert_equal(true, t.utc?)
|
||||
end
|
||||
|
||||
+ def test_rfc2822_nonlinear
|
||||
+ pre = ->(n) {"0 Feb 00 00 :00" + " " * n}
|
||||
+ assert_linear_performance([100, 500, 5000, 50_000], pre: pre) do |s|
|
||||
+ assert_raise(ArgumentError) do
|
||||
+ Time.rfc2822(s)
|
||||
+ end
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
def test_encode_rfc2822
|
||||
t = Time.utc(1)
|
||||
assert_equal("Mon, 01 Jan 0001 00:00:00 -0000", t.rfc2822)
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -7,6 +7,7 @@ SRC_URI += " \
|
||||
file://run-ptest \
|
||||
file://0001-Modify-shebang-of-libexec-y2racc-and-libexec-racc2y.patch \
|
||||
file://0001-template-Makefile.in-do-not-write-host-cross-cc-item.patch \
|
||||
file://CVE-2023-28756.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "f972fb0cce662966bec10d5c5f32d042"
|
||||
|
||||
@@ -14,7 +14,7 @@ stack than are available.
|
||||
|
||||
To cope, add in stack limit checking to throw an appropriate error when this
|
||||
happens.
|
||||
|
||||
CVE: CVE-2021-45944
|
||||
Upstream-Status: Backported [https://git.ghostscript.com/?p=ghostpdl.git;a=patch;h=7861fcad13c497728189feafb41cd57b5b50ea25]
|
||||
Signed-off-by: Minjae Kim <flowergom@gmail.com>
|
||||
---
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
From cfaa28168a07ea4a53276b63068f94fce37d6aff Mon Sep 17 00:00:00 2001
|
||||
From: Tim Kientzle <kientzle@acm.org>
|
||||
Date: Thu, 24 Mar 2022 10:35:00 +0100
|
||||
Subject: [PATCH] ZIP reader: fix possible out-of-bounds read in
|
||||
zipx_lzma_alone_init()
|
||||
|
||||
Fixes #1672
|
||||
|
||||
CVE: CVE-2022-26280
|
||||
Upstream-Status: Backport [https://github.com/libarchive/libarchive/commit/cfaa28168a07ea4a53276b63068f94fce37d6aff]
|
||||
Signed-off-by: Andrej Valek <andrej.valek@siemens.com>
|
||||
|
||||
---
|
||||
libarchive/archive_read_support_format_zip.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c
|
||||
index 38ada70b5..9d6c900b2 100644
|
||||
--- a/libarchive/archive_read_support_format_zip.c
|
||||
+++ b/libarchive/archive_read_support_format_zip.c
|
||||
@@ -1667,7 +1667,7 @@ zipx_lzma_alone_init(struct archive_read *a, struct zip *zip)
|
||||
*/
|
||||
|
||||
/* Read magic1,magic2,lzma_params from the ZIPX stream. */
|
||||
- if((p = __archive_read_ahead(a, 9, NULL)) == NULL) {
|
||||
+ if(zip->entry_bytes_remaining < 9 || (p = __archive_read_ahead(a, 9, NULL)) == NULL) {
|
||||
archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
|
||||
"Truncated lzma data");
|
||||
return (ARCHIVE_FATAL);
|
||||
@@ -39,6 +39,7 @@ SRC_URI = "http://libarchive.org/downloads/libarchive-${PV}.tar.gz \
|
||||
file://CVE-2021-23177.patch \
|
||||
file://CVE-2021-31566-01.patch \
|
||||
file://CVE-2021-31566-02.patch \
|
||||
file://CVE-2022-26280.patch \
|
||||
file://CVE-2022-36227.patch \
|
||||
"
|
||||
|
||||
|
||||
40
meta/recipes-extended/screen/screen/CVE-2023-24626.patch
Normal file
40
meta/recipes-extended/screen/screen/CVE-2023-24626.patch
Normal file
@@ -0,0 +1,40 @@
|
||||
From e9ad41bfedb4537a6f0de20f00b27c7739f168f7 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Naumov <alexander_naumov@opensuse.org>
|
||||
Date: Mon, 30 Jan 2023 17:22:25 +0200
|
||||
Subject: fix: missing signal sending permission check on failed query messages
|
||||
|
||||
Signed-off-by: Alexander Naumov <alexander_naumov@opensuse.org>
|
||||
|
||||
CVE: CVE-2023-24626
|
||||
Upstream-Status: Backport [https://git.savannah.gnu.org/cgit/screen.git/commit/?id=e9ad41bfedb4537a6f0de20f00b27c7739f168f7]
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
socket.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/socket.c b/socket.c
|
||||
index bb68b35..9d87445 100644
|
||||
--- a/socket.c
|
||||
+++ b/socket.c
|
||||
@@ -1285,11 +1285,16 @@ ReceiveMsg()
|
||||
else
|
||||
queryflag = -1;
|
||||
|
||||
- Kill(m.m.command.apid,
|
||||
+ if (CheckPid(m.m.command.apid)) {
|
||||
+ Msg(0, "Query attempt with bad pid(%d)!", m.m.command.apid);
|
||||
+ }
|
||||
+ else {
|
||||
+ Kill(m.m.command.apid,
|
||||
(queryflag >= 0)
|
||||
? SIGCONT
|
||||
: SIG_BYE); /* Send SIG_BYE if an error happened */
|
||||
- queryflag = -1;
|
||||
+ queryflag = -1;
|
||||
+ }
|
||||
}
|
||||
break;
|
||||
case MSG_COMMAND:
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -22,6 +22,7 @@ SRC_URI = "${GNU_MIRROR}/screen/screen-${PV}.tar.gz \
|
||||
file://0001-fix-for-multijob-build.patch \
|
||||
file://0001-Remove-more-compatibility-stuff.patch \
|
||||
file://CVE-2021-26937.patch \
|
||||
file://CVE-2023-24626.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "d276213d3acd10339cd37848b8c4ab1e"
|
||||
|
||||
@@ -0,0 +1,646 @@
|
||||
Origin: Backport obtained from SUSE. Thanks!
|
||||
|
||||
From 334daf92b31b79ce68ed75e2ee14fca265f029ca Mon Sep 17 00:00:00 2001
|
||||
From: "Todd C. Miller" <Todd.Miller@sudo.ws>
|
||||
Date: Wed, 18 Jan 2023 08:21:34 -0700
|
||||
Subject: [PATCH] Escape control characters in log messages and "sudoreplay -l"
|
||||
output. The log message contains user-controlled strings that could include
|
||||
things like terminal control characters. Space characters in the command
|
||||
path are now also escaped.
|
||||
|
||||
Command line arguments that contain spaces are surrounded with
|
||||
single quotes and any literal single quote or backslash characters
|
||||
are escaped with a backslash. This makes it possible to distinguish
|
||||
multiple command line arguments from a single argument that contains
|
||||
spaces.
|
||||
|
||||
Issue found by Matthieu Barjole and Victor Cutillas of Synacktiv
|
||||
(https://synacktiv.com).
|
||||
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/sudo/tree/debian/patches/CVE-2023-2848x-1.patch?h=ubuntu/focal-security
|
||||
Upstream commit https://github.com/sudo-project/sudo/commit/334daf92b31b79ce68ed75e2ee14fca265f029ca]
|
||||
CVE: CVE-2023-28486 CVE-2023-28487
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
doc/sudoers.man.in | 33 +++++++--
|
||||
doc/sudoers.mdoc.in | 28 ++++++--
|
||||
doc/sudoreplay.man.in | 9 ++
|
||||
doc/sudoreplay.mdoc.in | 10 ++
|
||||
include/sudo_compat.h | 6 +
|
||||
include/sudo_lbuf.h | 7 ++
|
||||
lib/util/lbuf.c | 106 +++++++++++++++++++++++++++++++
|
||||
lib/util/util.exp.in | 1
|
||||
plugins/sudoers/logging.c | 145 +++++++++++--------------------------------
|
||||
plugins/sudoers/sudoreplay.c | 44 +++++++++----
|
||||
10 files changed, 257 insertions(+), 132 deletions(-)
|
||||
|
||||
--- a/doc/sudoers.man.in
|
||||
+++ b/doc/sudoers.man.in
|
||||
@@ -4566,6 +4566,19 @@ can log events using either
|
||||
syslog(3)
|
||||
or a simple log file.
|
||||
The log format is almost identical in both cases.
|
||||
+Any control characters present in the log data are formatted in octal
|
||||
+with a leading
|
||||
+\(oq#\(cq
|
||||
+character.
|
||||
+For example, a horizontal tab is stored as
|
||||
+\(oq#011\(cq
|
||||
+and an embedded carriage return is stored as
|
||||
+\(oq#015\(cq.
|
||||
+In addition, space characters in the command path are stored as
|
||||
+\(oq#040\(cq.
|
||||
+Literal single quotes and backslash characters
|
||||
+(\(oq\e\(cq)
|
||||
+in command line arguments are escaped with a backslash.
|
||||
.SS "Accepted command log entries"
|
||||
Commands that sudo runs are logged using the following format (split
|
||||
into multiple lines for readability):
|
||||
@@ -4646,7 +4659,7 @@ A list of environment variables specifie
|
||||
if specified.
|
||||
.TP 14n
|
||||
command
|
||||
-The actual command that was executed.
|
||||
+The actual command that was executed, including any command line arguments.
|
||||
.PP
|
||||
Messages are logged using the locale specified by
|
||||
\fIsudoers_locale\fR,
|
||||
@@ -4882,17 +4895,21 @@ with a few important differences:
|
||||
1.\&
|
||||
The
|
||||
\fIprogname\fR
|
||||
-and
|
||||
-\fIhostname\fR
|
||||
-fields are not present.
|
||||
+field is not present.
|
||||
.TP 5n
|
||||
2.\&
|
||||
-If the
|
||||
-\fIlog_year\fR
|
||||
-option is enabled,
|
||||
-the date will also include the year.
|
||||
+The
|
||||
+\fIhostname\fR
|
||||
+is only logged if the
|
||||
+\fIlog_host\fR
|
||||
+option is enabled.
|
||||
.TP 5n
|
||||
3.\&
|
||||
+The date does not include the year unless the
|
||||
+\fIlog_year\fR
|
||||
+option is enabled.
|
||||
+.TP 5n
|
||||
+4.\&
|
||||
Lines that are longer than
|
||||
\fIloglinelen\fR
|
||||
characters (80 by default) are word-wrapped and continued on the
|
||||
--- a/doc/sudoers.mdoc.in
|
||||
+++ b/doc/sudoers.mdoc.in
|
||||
@@ -4261,6 +4261,19 @@ can log events using either
|
||||
.Xr syslog 3
|
||||
or a simple log file.
|
||||
The log format is almost identical in both cases.
|
||||
+Any control characters present in the log data are formatted in octal
|
||||
+with a leading
|
||||
+.Ql #
|
||||
+character.
|
||||
+For example, a horizontal tab is stored as
|
||||
+.Ql #011
|
||||
+and an embedded carriage return is stored as
|
||||
+.Ql #015 .
|
||||
+In addition, space characters in the command path are stored as
|
||||
+.Ql #040 .
|
||||
+Literal single quotes and backslash characters
|
||||
+.Pq Ql \e
|
||||
+in command line arguments are escaped with a backslash.
|
||||
.Ss Accepted command log entries
|
||||
Commands that sudo runs are logged using the following format (split
|
||||
into multiple lines for readability):
|
||||
@@ -4328,7 +4341,7 @@ option is enabled.
|
||||
A list of environment variables specified on the command line,
|
||||
if specified.
|
||||
.It command
|
||||
-The actual command that was executed.
|
||||
+The actual command that was executed, including any command line arguments.
|
||||
.El
|
||||
.Pp
|
||||
Messages are logged using the locale specified by
|
||||
@@ -4550,14 +4563,17 @@ with a few important differences:
|
||||
.It
|
||||
The
|
||||
.Em progname
|
||||
-and
|
||||
+field is not present.
|
||||
+.It
|
||||
+The
|
||||
.Em hostname
|
||||
-fields are not present.
|
||||
+is only logged if the
|
||||
+.Em log_host
|
||||
+option is enabled.
|
||||
.It
|
||||
-If the
|
||||
+The date does not include the year unless the
|
||||
.Em log_year
|
||||
-option is enabled,
|
||||
-the date will also include the year.
|
||||
+option is enabled.
|
||||
.It
|
||||
Lines that are longer than
|
||||
.Em loglinelen
|
||||
--- a/doc/sudoreplay.man.in
|
||||
+++ b/doc/sudoreplay.man.in
|
||||
@@ -149,6 +149,15 @@ In this mode,
|
||||
will list available sessions in a format similar to the
|
||||
\fBsudo\fR
|
||||
log file format, sorted by file name (or sequence number).
|
||||
+Any control characters present in the log data are formated in octal
|
||||
+with a leading
|
||||
+\(oq#\(cq
|
||||
+character.
|
||||
+For example, a horizontal tab is displayed as
|
||||
+\(oq#011\(cq
|
||||
+and an embedded carriage return is displayed as
|
||||
+\(oq#015\(cq.
|
||||
+.sp
|
||||
If a
|
||||
\fIsearch expression\fR
|
||||
is specified, it will be used to restrict the IDs that are displayed.
|
||||
--- a/doc/sudoreplay.mdoc.in
|
||||
+++ b/doc/sudoreplay.mdoc.in
|
||||
@@ -142,6 +142,16 @@ In this mode,
|
||||
will list available sessions in a format similar to the
|
||||
.Nm sudo
|
||||
log file format, sorted by file name (or sequence number).
|
||||
+Any control characters present in the log data are formatted in octal
|
||||
+with a leading
|
||||
+.Ql #
|
||||
+character.
|
||||
+For example, a horizontal tab is displayed as
|
||||
+.Ql #011
|
||||
+and an embedded carriage return is displayed as
|
||||
+.Ql #015 .
|
||||
+Space characters in the command name and arguments are also formatted in octal.
|
||||
+.Pp
|
||||
If a
|
||||
.Ar search expression
|
||||
is specified, it will be used to restrict the IDs that are displayed.
|
||||
--- a/include/sudo_compat.h
|
||||
+++ b/include/sudo_compat.h
|
||||
@@ -79,6 +79,12 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
+#ifdef HAVE_FALLTHROUGH_ATTRIBUTE
|
||||
+# define FALLTHROUGH __attribute__((__fallthrough__))
|
||||
+#else
|
||||
+# define FALLTHROUGH do { } while (0)
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Given the pointer x to the member m of the struct s, return
|
||||
* a pointer to the containing structure.
|
||||
--- a/include/sudo_lbuf.h
|
||||
+++ b/include/sudo_lbuf.h
|
||||
@@ -36,9 +36,15 @@ struct sudo_lbuf {
|
||||
|
||||
typedef int (*sudo_lbuf_output_t)(const char *);
|
||||
|
||||
+/* Flags for sudo_lbuf_append_esc() */
|
||||
+#define LBUF_ESC_CNTRL 0x01
|
||||
+#define LBUF_ESC_BLANK 0x02
|
||||
+#define LBUF_ESC_QUOTE 0x04
|
||||
+
|
||||
__dso_public void sudo_lbuf_init_v1(struct sudo_lbuf *lbuf, sudo_lbuf_output_t output, int indent, const char *continuation, int cols);
|
||||
__dso_public void sudo_lbuf_destroy_v1(struct sudo_lbuf *lbuf);
|
||||
__dso_public bool sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) __printflike(2, 3);
|
||||
+__dso_public bool sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char *fmt, ...) __printflike(3, 4);
|
||||
__dso_public bool sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...) __printflike(3, 4);
|
||||
__dso_public void sudo_lbuf_print_v1(struct sudo_lbuf *lbuf);
|
||||
__dso_public bool sudo_lbuf_error_v1(struct sudo_lbuf *lbuf);
|
||||
@@ -47,6 +53,7 @@ __dso_public void sudo_lbuf_clearerr_v1(
|
||||
#define sudo_lbuf_init(_a, _b, _c, _d, _e) sudo_lbuf_init_v1((_a), (_b), (_c), (_d), (_e))
|
||||
#define sudo_lbuf_destroy(_a) sudo_lbuf_destroy_v1((_a))
|
||||
#define sudo_lbuf_append sudo_lbuf_append_v1
|
||||
+#define sudo_lbuf_append_esc sudo_lbuf_append_esc_v1
|
||||
#define sudo_lbuf_append_quoted sudo_lbuf_append_quoted_v1
|
||||
#define sudo_lbuf_print(_a) sudo_lbuf_print_v1((_a))
|
||||
#define sudo_lbuf_error(_a) sudo_lbuf_error_v1((_a))
|
||||
--- a/lib/util/lbuf.c
|
||||
+++ b/lib/util/lbuf.c
|
||||
@@ -93,6 +93,112 @@ sudo_lbuf_expand(struct sudo_lbuf *lbuf,
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Escape a character in octal form (#0n) and store it as a string
|
||||
+ * in buf, which must have at least 6 bytes available.
|
||||
+ * Returns the length of buf, not counting the terminating NUL byte.
|
||||
+ */
|
||||
+static int
|
||||
+escape(unsigned char ch, char *buf)
|
||||
+{
|
||||
+ const int len = ch < 0100 ? (ch < 010 ? 3 : 4) : 5;
|
||||
+
|
||||
+ /* Work backwards from the least significant digit to most significant. */
|
||||
+ switch (len) {
|
||||
+ case 5:
|
||||
+ buf[4] = (ch & 7) + '0';
|
||||
+ ch >>= 3;
|
||||
+ FALLTHROUGH;
|
||||
+ case 4:
|
||||
+ buf[3] = (ch & 7) + '0';
|
||||
+ ch >>= 3;
|
||||
+ FALLTHROUGH;
|
||||
+ case 3:
|
||||
+ buf[2] = (ch & 7) + '0';
|
||||
+ buf[1] = '0';
|
||||
+ buf[0] = '#';
|
||||
+ break;
|
||||
+ }
|
||||
+ buf[len] = '\0';
|
||||
+
|
||||
+ return len;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Parse the format and append strings, only %s and %% escapes are supported.
|
||||
+ * Any non-printable characters are escaped in octal as #0nn.
|
||||
+ */
|
||||
+bool
|
||||
+sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char *fmt, ...)
|
||||
+{
|
||||
+ unsigned int saved_len = lbuf->len;
|
||||
+ bool ret = false;
|
||||
+ const char *s;
|
||||
+ va_list ap;
|
||||
+ debug_decl(sudo_lbuf_append_esc, SUDO_DEBUG_UTIL);
|
||||
+
|
||||
+ if (sudo_lbuf_error(lbuf))
|
||||
+ debug_return_bool(false);
|
||||
+
|
||||
+#define should_escape(ch) \
|
||||
+ ((ISSET(flags, LBUF_ESC_CNTRL) && iscntrl((unsigned char)ch)) || \
|
||||
+ (ISSET(flags, LBUF_ESC_BLANK) && isblank((unsigned char)ch)))
|
||||
+#define should_quote(ch) \
|
||||
+ (ISSET(flags, LBUF_ESC_QUOTE) && (ch == '\'' || ch == '\\'))
|
||||
+
|
||||
+ va_start(ap, fmt);
|
||||
+ while (*fmt != '\0') {
|
||||
+ if (fmt[0] == '%' && fmt[1] == 's') {
|
||||
+ if ((s = va_arg(ap, char *)) == NULL)
|
||||
+ s = "(NULL)";
|
||||
+ while (*s != '\0') {
|
||||
+ if (should_escape(*s)) {
|
||||
+ if (!sudo_lbuf_expand(lbuf, sizeof("#0177") - 1))
|
||||
+ goto done;
|
||||
+ lbuf->len += escape(*s++, lbuf->buf + lbuf->len);
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (should_quote(*s)) {
|
||||
+ if (!sudo_lbuf_expand(lbuf, 2))
|
||||
+ goto done;
|
||||
+ lbuf->buf[lbuf->len++] = '\\';
|
||||
+ lbuf->buf[lbuf->len++] = *s++;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (!sudo_lbuf_expand(lbuf, 1))
|
||||
+ goto done;
|
||||
+ lbuf->buf[lbuf->len++] = *s++;
|
||||
+ }
|
||||
+ fmt += 2;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (should_escape(*fmt)) {
|
||||
+ if (!sudo_lbuf_expand(lbuf, sizeof("#0177") - 1))
|
||||
+ goto done;
|
||||
+ if (*fmt == '\'') {
|
||||
+ lbuf->buf[lbuf->len++] = '\\';
|
||||
+ lbuf->buf[lbuf->len++] = *fmt++;
|
||||
+ } else {
|
||||
+ lbuf->len += escape(*fmt++, lbuf->buf + lbuf->len);
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (!sudo_lbuf_expand(lbuf, 1))
|
||||
+ goto done;
|
||||
+ lbuf->buf[lbuf->len++] = *fmt++;
|
||||
+ }
|
||||
+ ret = true;
|
||||
+
|
||||
+done:
|
||||
+ if (!ret)
|
||||
+ lbuf->len = saved_len;
|
||||
+ if (lbuf->size != 0)
|
||||
+ lbuf->buf[lbuf->len] = '\0';
|
||||
+ va_end(ap);
|
||||
+
|
||||
+ debug_return_bool(ret);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* Parse the format and append strings, only %s and %% escapes are supported.
|
||||
* Any characters in set are quoted with a backslash.
|
||||
*/
|
||||
--- a/lib/util/util.exp.in
|
||||
+++ b/lib/util/util.exp.in
|
||||
@@ -79,6 +79,7 @@ sudo_gethostname_v1
|
||||
sudo_gettime_awake_v1
|
||||
sudo_gettime_mono_v1
|
||||
sudo_gettime_real_v1
|
||||
+sudo_lbuf_append_esc_v1
|
||||
sudo_lbuf_append_quoted_v1
|
||||
sudo_lbuf_append_v1
|
||||
sudo_lbuf_clearerr_v1
|
||||
--- a/plugins/sudoers/logging.c
|
||||
+++ b/plugins/sudoers/logging.c
|
||||
@@ -58,6 +58,7 @@
|
||||
#include <syslog.h>
|
||||
|
||||
#include "sudoers.h"
|
||||
+#include "sudo_lbuf.h"
|
||||
|
||||
#ifndef HAVE_GETADDRINFO
|
||||
# include "compat/getaddrinfo.h"
|
||||
@@ -940,14 +941,6 @@ should_mail(int status)
|
||||
(def_mail_no_perms && !ISSET(status, VALIDATE_SUCCESS)));
|
||||
}
|
||||
|
||||
-#define LL_TTY_STR "TTY="
|
||||
-#define LL_CWD_STR "PWD=" /* XXX - should be CWD= */
|
||||
-#define LL_USER_STR "USER="
|
||||
-#define LL_GROUP_STR "GROUP="
|
||||
-#define LL_ENV_STR "ENV="
|
||||
-#define LL_CMND_STR "COMMAND="
|
||||
-#define LL_TSID_STR "TSID="
|
||||
-
|
||||
#define IS_SESSID(s) ( \
|
||||
isalnum((unsigned char)(s)[0]) && isalnum((unsigned char)(s)[1]) && \
|
||||
(s)[2] == '/' && \
|
||||
@@ -962,14 +955,16 @@ should_mail(int status)
|
||||
static char *
|
||||
new_logline(const char *message, const char *errstr)
|
||||
{
|
||||
- char *line = NULL, *evstr = NULL;
|
||||
#ifndef SUDOERS_NO_SEQ
|
||||
char sessid[7];
|
||||
#endif
|
||||
const char *tsid = NULL;
|
||||
- size_t len = 0;
|
||||
+ struct sudo_lbuf lbuf;
|
||||
+ int i;
|
||||
debug_decl(new_logline, SUDOERS_DEBUG_LOGGING)
|
||||
|
||||
+ sudo_lbuf_init(&lbuf, NULL, 0, NULL, 0);
|
||||
+
|
||||
#ifndef SUDOERS_NO_SEQ
|
||||
/* A TSID may be a sudoers-style session ID or a free-form string. */
|
||||
if (sudo_user.iolog_file != NULL) {
|
||||
@@ -989,119 +984,55 @@ new_logline(const char *message, const c
|
||||
#endif
|
||||
|
||||
/*
|
||||
- * Compute line length
|
||||
+ * Format the log line as an lbuf, escaping control characters in
|
||||
+ * octal form (#0nn). Error checking (ENOMEM) is done at the end.
|
||||
*/
|
||||
- if (message != NULL)
|
||||
- len += strlen(message) + 3;
|
||||
- if (errstr != NULL)
|
||||
- len += strlen(errstr) + 3;
|
||||
- len += sizeof(LL_TTY_STR) + 2 + strlen(user_tty);
|
||||
- len += sizeof(LL_CWD_STR) + 2 + strlen(user_cwd);
|
||||
- if (runas_pw != NULL)
|
||||
- len += sizeof(LL_USER_STR) + 2 + strlen(runas_pw->pw_name);
|
||||
- if (runas_gr != NULL)
|
||||
- len += sizeof(LL_GROUP_STR) + 2 + strlen(runas_gr->gr_name);
|
||||
- if (tsid != NULL)
|
||||
- len += sizeof(LL_TSID_STR) + 2 + strlen(tsid);
|
||||
- if (sudo_user.env_vars != NULL) {
|
||||
- size_t evlen = 0;
|
||||
- char * const *ep;
|
||||
-
|
||||
- for (ep = sudo_user.env_vars; *ep != NULL; ep++)
|
||||
- evlen += strlen(*ep) + 1;
|
||||
- if (evlen != 0) {
|
||||
- if ((evstr = malloc(evlen)) == NULL)
|
||||
- goto oom;
|
||||
- evstr[0] = '\0';
|
||||
- for (ep = sudo_user.env_vars; *ep != NULL; ep++) {
|
||||
- strlcat(evstr, *ep, evlen);
|
||||
- strlcat(evstr, " ", evlen); /* NOTE: last one will fail */
|
||||
- }
|
||||
- len += sizeof(LL_ENV_STR) + 2 + evlen;
|
||||
- }
|
||||
- }
|
||||
- if (user_cmnd != NULL) {
|
||||
- /* Note: we log "sudo -l command arg ..." as "list command arg ..." */
|
||||
- len += sizeof(LL_CMND_STR) - 1 + strlen(user_cmnd);
|
||||
- if (ISSET(sudo_mode, MODE_CHECK))
|
||||
- len += sizeof("list ") - 1;
|
||||
- if (user_args != NULL)
|
||||
- len += strlen(user_args) + 1;
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * Allocate and build up the line.
|
||||
- */
|
||||
- if ((line = malloc(++len)) == NULL)
|
||||
- goto oom;
|
||||
- line[0] = '\0';
|
||||
|
||||
if (message != NULL) {
|
||||
- if (strlcat(line, message, len) >= len ||
|
||||
- strlcat(line, errstr ? " : " : " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "%s%s", message,
|
||||
+ errstr ? " : " : " ; ");
|
||||
}
|
||||
if (errstr != NULL) {
|
||||
- if (strlcat(line, errstr, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
- }
|
||||
- if (strlcat(line, LL_TTY_STR, len) >= len ||
|
||||
- strlcat(line, user_tty, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
- if (strlcat(line, LL_CWD_STR, len) >= len ||
|
||||
- strlcat(line, user_cwd, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "%s ; ", errstr);
|
||||
+ }
|
||||
+ if (user_tty != NULL) {
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "TTY=%s ; ", user_tty);
|
||||
+ }
|
||||
+ if (user_cwd != NULL) {
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "PWD=%s ; ", user_cwd);
|
||||
+ }
|
||||
if (runas_pw != NULL) {
|
||||
- if (strlcat(line, LL_USER_STR, len) >= len ||
|
||||
- strlcat(line, runas_pw->pw_name, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "USER=%s ; ",
|
||||
+ runas_pw->pw_name);
|
||||
}
|
||||
if (runas_gr != NULL) {
|
||||
- if (strlcat(line, LL_GROUP_STR, len) >= len ||
|
||||
- strlcat(line, runas_gr->gr_name, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "GROUP=%s ; ",
|
||||
+ runas_gr->gr_name);
|
||||
}
|
||||
if (tsid != NULL) {
|
||||
- if (strlcat(line, LL_TSID_STR, len) >= len ||
|
||||
- strlcat(line, tsid, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
- }
|
||||
- if (evstr != NULL) {
|
||||
- if (strlcat(line, LL_ENV_STR, len) >= len ||
|
||||
- strlcat(line, evstr, len) >= len ||
|
||||
- strlcat(line, " ; ", len) >= len)
|
||||
- goto toobig;
|
||||
- free(evstr);
|
||||
- evstr = NULL;
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "TSID=%s ; ", tsid);
|
||||
+ }
|
||||
+ if (sudo_user.env_vars != NULL) {
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, "ENV=%s", sudo_user.env_vars[0]);
|
||||
+ for (i = 1; sudo_user.env_vars[i] != NULL; i++) {
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, " %s",
|
||||
+ sudo_user.env_vars[i]);
|
||||
+ }
|
||||
}
|
||||
if (user_cmnd != NULL) {
|
||||
- if (strlcat(line, LL_CMND_STR, len) >= len)
|
||||
- goto toobig;
|
||||
- if (ISSET(sudo_mode, MODE_CHECK) && strlcat(line, "list ", len) >= len)
|
||||
- goto toobig;
|
||||
- if (strlcat(line, user_cmnd, len) >= len)
|
||||
- goto toobig;
|
||||
+ sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL|LBUF_ESC_BLANK,
|
||||
+ "COMMAND=%s", user_cmnd);
|
||||
if (user_args != NULL) {
|
||||
- if (strlcat(line, " ", len) >= len ||
|
||||
- strlcat(line, user_args, len) >= len)
|
||||
- goto toobig;
|
||||
+ sudo_lbuf_append_esc(&lbuf,
|
||||
+ LBUF_ESC_CNTRL|LBUF_ESC_QUOTE,
|
||||
+ " %s", user_args);
|
||||
}
|
||||
}
|
||||
|
||||
- debug_return_str(line);
|
||||
-oom:
|
||||
- free(evstr);
|
||||
+ if (!sudo_lbuf_error(&lbuf))
|
||||
+ debug_return_str(lbuf.buf);
|
||||
+
|
||||
+ sudo_lbuf_destroy(&lbuf);
|
||||
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
debug_return_str(NULL);
|
||||
-toobig:
|
||||
- free(evstr);
|
||||
- free(line);
|
||||
- sudo_warnx(U_("internal error, %s overflow"), __func__);
|
||||
- debug_return_str(NULL);
|
||||
}
|
||||
--- a/plugins/sudoers/sudoreplay.c
|
||||
+++ b/plugins/sudoers/sudoreplay.c
|
||||
@@ -71,6 +71,7 @@
|
||||
#include "sudo_conf.h"
|
||||
#include "sudo_debug.h"
|
||||
#include "sudo_event.h"
|
||||
+#include "sudo_lbuf.h"
|
||||
#include "sudo_util.h"
|
||||
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
@@ -1353,7 +1354,8 @@ match_expr(struct search_node_list *head
|
||||
}
|
||||
|
||||
static int
|
||||
-list_session(char *logfile, regex_t *re, const char *user, const char *tty)
|
||||
+list_session(struct sudo_lbuf *lbuf, char *logfile, regex_t *re,
|
||||
+ const char *user, const char *tty)
|
||||
{
|
||||
char idbuf[7], *idstr, *cp;
|
||||
const char *timestr;
|
||||
@@ -1386,16 +1388,32 @@ list_session(char *logfile, regex_t *re,
|
||||
}
|
||||
/* XXX - print rows + cols? */
|
||||
timestr = get_timestr(li->tstamp, 1);
|
||||
- printf("%s : %s : TTY=%s ; CWD=%s ; USER=%s ; ",
|
||||
- timestr ? timestr : "invalid date",
|
||||
- li->user, li->tty, li->cwd, li->runas_user);
|
||||
- if (li->runas_group)
|
||||
- printf("GROUP=%s ; ", li->runas_group);
|
||||
- printf("TSID=%s ; COMMAND=%s\n", idstr, li->cmd);
|
||||
-
|
||||
- ret = 0;
|
||||
-
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "%s : %s : ",
|
||||
+ timestr ? timestr : "invalid date", li->user);
|
||||
+ if (li->tty != NULL) {
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "TTY=%s ; ",
|
||||
+ li->tty);
|
||||
+ }
|
||||
+ if (li->cwd != NULL) {
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "CWD=%s ; ",
|
||||
+ li->cwd);
|
||||
+ }
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "USER=%s ; ", li->runas_user);
|
||||
+ if (li->runas_group != NULL) {
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "GROUP=%s ; ",
|
||||
+ li->runas_group);
|
||||
+ }
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "TSID=%s ; ", idstr);
|
||||
+ sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL, "COMMAND=%s",
|
||||
+ li->cmd);
|
||||
+
|
||||
+ if (!sudo_lbuf_error(lbuf)) {
|
||||
+ puts(lbuf->buf);
|
||||
+ ret = 0;
|
||||
+ }
|
||||
done:
|
||||
+ lbuf->error = 0;
|
||||
+ lbuf->len = 0;
|
||||
free_log_info(li);
|
||||
debug_return_int(ret);
|
||||
}
|
||||
@@ -1415,6 +1433,7 @@ find_sessions(const char *dir, regex_t *
|
||||
DIR *d;
|
||||
struct dirent *dp;
|
||||
struct stat sb;
|
||||
+ struct sudo_lbuf lbuf;
|
||||
size_t sdlen, sessions_len = 0, sessions_size = 0;
|
||||
unsigned int i;
|
||||
int len;
|
||||
@@ -1426,6 +1445,8 @@ find_sessions(const char *dir, regex_t *
|
||||
#endif
|
||||
debug_decl(find_sessions, SUDO_DEBUG_UTIL)
|
||||
|
||||
+ sudo_lbuf_init(&lbuf, NULL, 0, NULL, 0);
|
||||
+
|
||||
d = opendir(dir);
|
||||
if (d == NULL)
|
||||
sudo_fatal(U_("unable to open %s"), dir);
|
||||
@@ -1485,7 +1506,7 @@ find_sessions(const char *dir, regex_t *
|
||||
|
||||
/* Check for dir with a log file. */
|
||||
if (lstat(pathbuf, &sb) == 0 && S_ISREG(sb.st_mode)) {
|
||||
- list_session(pathbuf, re, user, tty);
|
||||
+ list_session(&lbuf, pathbuf, re, user, tty);
|
||||
} else {
|
||||
/* Strip off "/log" and recurse if a dir. */
|
||||
pathbuf[sdlen + len - 4] = '\0';
|
||||
@@ -1496,6 +1517,7 @@ find_sessions(const char *dir, regex_t *
|
||||
}
|
||||
free(sessions);
|
||||
}
|
||||
+ sudo_lbuf_destroy(&lbuf);
|
||||
|
||||
debug_return_int(0);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
Backport of:
|
||||
|
||||
From 12648b4e0a8cf486480442efd52f0e0b6cab6e8b Mon Sep 17 00:00:00 2001
|
||||
From: "Todd C. Miller" <Todd.Miller@sudo.ws>
|
||||
Date: Mon, 13 Mar 2023 08:04:32 -0600
|
||||
Subject: [PATCH] Add missing " ; " separator between environment variables and
|
||||
command. This is a regression introduced in sudo 1.9.13. GitHub issue #254.
|
||||
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/sudo/tree/debian/patches/CVE-2023-2848x-2.patch?h=ubuntu/focal-security
|
||||
Upstream commit https://github.com/sudo-project/sudo/commit/12648b4e0a8cf486480442efd52f0e0b6cab6e8b]
|
||||
CVE: CVE-2023-28486 CVE-2023-28487
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/eventlog/eventlog.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/plugins/sudoers/logging.c
|
||||
+++ b/plugins/sudoers/logging.c
|
||||
@@ -1018,6 +1018,7 @@ new_logline(const char *message, const c
|
||||
sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL, " %s",
|
||||
sudo_user.env_vars[i]);
|
||||
}
|
||||
+ sudo_lbuf_append(&lbuf, " ; ");
|
||||
}
|
||||
if (user_cmnd != NULL) {
|
||||
sudo_lbuf_append_esc(&lbuf, LBUF_ESC_CNTRL|LBUF_ESC_BLANK,
|
||||
@@ -6,6 +6,8 @@ SRC_URI = "https://www.sudo.ws/dist/sudo-${PV}.tar.gz \
|
||||
file://0001-Fix-includes-when-building-with-musl.patch \
|
||||
file://CVE-2022-43995.patch \
|
||||
file://CVE-2023-22809.patch \
|
||||
file://CVE-2023-28486_CVE-2023-28487-1.patch \
|
||||
file://CVE-2023-28486_CVE-2023-28487-2.patch \
|
||||
"
|
||||
|
||||
PAM_SRC_URI = "file://sudo.pam"
|
||||
|
||||
@@ -11,13 +11,13 @@ python () {
|
||||
raise bb.parse.SkipRecipe("Set PREFERRED_PROVIDER_virtual/kernel to linux-yocto-rt to enable it")
|
||||
}
|
||||
|
||||
SRCREV_machine ?= "053238af99b52ce5ffb19755cdfeb10f206463da"
|
||||
SRCREV_meta ?= "9c5bb858a6f5a9b1cc2e585e74e8517387863fd7"
|
||||
SRCREV_machine ?= "f064f6017b7ce09ade0f365e1b7d776dc9e2e168"
|
||||
SRCREV_meta ?= "c7e2e528893abbebd14447510d38ded1ef98dcd2"
|
||||
|
||||
SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine \
|
||||
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-5.4;destsuffix=${KMETA}"
|
||||
|
||||
LINUX_VERSION ?= "5.4.230"
|
||||
LINUX_VERSION ?= "5.4.237"
|
||||
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ KCONFIG_MODE = "--allnoconfig"
|
||||
|
||||
require recipes-kernel/linux/linux-yocto.inc
|
||||
|
||||
LINUX_VERSION ?= "5.4.230"
|
||||
LINUX_VERSION ?= "5.4.237"
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814"
|
||||
|
||||
DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}"
|
||||
@@ -15,9 +15,9 @@ DEPENDS += "openssl-native util-linux-native"
|
||||
KMETA = "kernel-meta"
|
||||
KCONF_BSP_AUDIT_LEVEL = "2"
|
||||
|
||||
SRCREV_machine_qemuarm ?= "8517d03dcde5d19a2fd9493433275b3790450ae5"
|
||||
SRCREV_machine ?= "d05044bfcb54db9a3dfb9cccd3a39c2c07d844b1"
|
||||
SRCREV_meta ?= "9c5bb858a6f5a9b1cc2e585e74e8517387863fd7"
|
||||
SRCREV_machine_qemuarm ?= "00c3a33c0f772ff1fa8902e8fe8856131c27a9b5"
|
||||
SRCREV_machine ?= "0693cbc007cf6a7b335edb5f78542d77b048d5dd"
|
||||
SRCREV_meta ?= "c7e2e528893abbebd14447510d38ded1ef98dcd2"
|
||||
|
||||
PV = "${LINUX_VERSION}+git${SRCPV}"
|
||||
|
||||
|
||||
@@ -12,16 +12,16 @@ KBRANCH_qemux86 ?= "v5.4/standard/base"
|
||||
KBRANCH_qemux86-64 ?= "v5.4/standard/base"
|
||||
KBRANCH_qemumips64 ?= "v5.4/standard/mti-malta64"
|
||||
|
||||
SRCREV_machine_qemuarm ?= "c3e35e461a4f880bfe3d007c763fe4ff1670621f"
|
||||
SRCREV_machine_qemuarm64 ?= "5604d6b87d39cd4eb427762610f505d5659ce73f"
|
||||
SRCREV_machine_qemumips ?= "d0ef5b5eea98083cbb30d42bb191b280d2637a02"
|
||||
SRCREV_machine_qemuppc ?= "79202d38795f70dd5c7601cbc8d1c54ecb831ad9"
|
||||
SRCREV_machine_qemuriscv64 ?= "c32d5a645da049cf72f9e6b819c32609c7effcec"
|
||||
SRCREV_machine_qemux86 ?= "c32d5a645da049cf72f9e6b819c32609c7effcec"
|
||||
SRCREV_machine_qemux86-64 ?= "c32d5a645da049cf72f9e6b819c32609c7effcec"
|
||||
SRCREV_machine_qemumips64 ?= "eafe1aabab778a089d20f0c686902a7a7215b57e"
|
||||
SRCREV_machine ?= "c32d5a645da049cf72f9e6b819c32609c7effcec"
|
||||
SRCREV_meta ?= "9c5bb858a6f5a9b1cc2e585e74e8517387863fd7"
|
||||
SRCREV_machine_qemuarm ?= "981be716d817e38d2d67269aab3caaa095bd2bdd"
|
||||
SRCREV_machine_qemuarm64 ?= "32083245f7eb993b85a33a8d30bd9f41128b6147"
|
||||
SRCREV_machine_qemumips ?= "4d002b5ac3b434b21ae58ac15cd73be3ae5ef5a8"
|
||||
SRCREV_machine_qemuppc ?= "82b4b51143a6beeb49efa548494bdb5c01f336b2"
|
||||
SRCREV_machine_qemuriscv64 ?= "936721bc390034d774b28393bf61808de8899718"
|
||||
SRCREV_machine_qemux86 ?= "936721bc390034d774b28393bf61808de8899718"
|
||||
SRCREV_machine_qemux86-64 ?= "936721bc390034d774b28393bf61808de8899718"
|
||||
SRCREV_machine_qemumips64 ?= "d662d749c441de5a09bfd8870cd10e41b1e27b6b"
|
||||
SRCREV_machine ?= "936721bc390034d774b28393bf61808de8899718"
|
||||
SRCREV_meta ?= "c7e2e528893abbebd14447510d38ded1ef98dcd2"
|
||||
|
||||
# remap qemuarm to qemuarma15 for the 5.4 kernel
|
||||
# KMACHINE_qemuarm ?= "qemuarma15"
|
||||
@@ -30,7 +30,7 @@ SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRA
|
||||
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-5.4;destsuffix=${KMETA}"
|
||||
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814"
|
||||
LINUX_VERSION ?= "5.4.230"
|
||||
LINUX_VERSION ?= "5.4.237"
|
||||
|
||||
DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}"
|
||||
DEPENDS += "openssl-native util-linux-native"
|
||||
|
||||
67
meta/recipes-multimedia/ffmpeg/ffmpeg/CVE-2022-3341.patch
Normal file
67
meta/recipes-multimedia/ffmpeg/ffmpeg/CVE-2022-3341.patch
Normal file
@@ -0,0 +1,67 @@
|
||||
From 9cf652cef49d74afe3d454f27d49eb1a1394951e Mon Sep 17 00:00:00 2001
|
||||
From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
|
||||
Date: Wed, 23 Feb 2022 10:31:59 +0800
|
||||
Subject: [PATCH] avformat/nutdec: Add check for avformat_new_stream
|
||||
|
||||
Check for failure of avformat_new_stream() and propagate
|
||||
the error code.
|
||||
|
||||
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
|
||||
|
||||
CVE: CVE-2022-3341
|
||||
|
||||
Upstream-Status: Backport [https://github.com/FFmpeg/FFmpeg/commit/9cf652cef49d74afe3d454f27d49eb1a1394951e]
|
||||
|
||||
Comments: Refreshed Hunk
|
||||
Signed-off-by: Narpat Mali <narpat.mali@windriver.com>
|
||||
Signed-off-by: Bhabu Bindu <bhabu.bindu@kpit.com>
|
||||
---
|
||||
libavformat/nutdec.c | 16 ++++++++++++----
|
||||
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
|
||||
index 0a8a700acf..f9ad2c0af1 100644
|
||||
--- a/libavformat/nutdec.c
|
||||
+++ b/libavformat/nutdec.c
|
||||
@@ -351,8 +351,12 @@ static int decode_main_header(NUTContext *nut)
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
- for (i = 0; i < stream_count; i++)
|
||||
- avformat_new_stream(s, NULL);
|
||||
+ for (i = 0; i < stream_count; i++) {
|
||||
+ if (!avformat_new_stream(s, NULL)) {
|
||||
+ ret = AVERROR(ENOMEM);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
@@ -793,19 +793,23 @@
|
||||
NUTContext *nut = s->priv_data;
|
||||
AVIOContext *bc = s->pb;
|
||||
int64_t pos;
|
||||
- int initialized_stream_count;
|
||||
+ int initialized_stream_count, ret;
|
||||
|
||||
nut->avf = s;
|
||||
|
||||
/* main header */
|
||||
pos = 0;
|
||||
+ ret = 0;
|
||||
do {
|
||||
+ if (ret == AVERROR(ENOMEM))
|
||||
+ return ret;
|
||||
+
|
||||
pos = find_startcode(bc, MAIN_STARTCODE, pos) + 1;
|
||||
if (pos < 0 + 1) {
|
||||
av_log(s, AV_LOG_ERROR, "No main startcode found.\n");
|
||||
goto fail;
|
||||
}
|
||||
- } while (decode_main_header(nut) < 0);
|
||||
+ } while ((ret = decode_main_header(nut)) < 0);
|
||||
|
||||
/* stream headers */
|
||||
pos = 0;
|
||||
|
||||
@@ -31,6 +31,7 @@ SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz \
|
||||
file://CVE-2021-38291.patch \
|
||||
file://CVE-2022-1475.patch \
|
||||
file://CVE-2022-3109.patch \
|
||||
file://CVE-2022-3341.patch \
|
||||
"
|
||||
SRC_URI[md5sum] = "348956fc2faa57a2f79bbb84ded9fbc3"
|
||||
SRC_URI[sha256sum] = "cb754255ab0ee2ea5f66f8850e1bd6ad5cac1cd855d0a2f4990fb8c668b0d29c"
|
||||
|
||||
@@ -9,7 +9,7 @@ SECTION = "console/utils"
|
||||
LICENSE = "GPLv2"
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
|
||||
|
||||
SRC_URI = "git://github.com/intel/${BPN};branch=master;protocol=https"
|
||||
SRC_URI = "git://github.com/intel/${BPN};branch=main;protocol=https"
|
||||
|
||||
SRCREV = "db7087b883bf52cbff063ad17a41cc1cbb85104d"
|
||||
S = "${WORKDIR}/git"
|
||||
|
||||
231
meta/recipes-support/curl/curl/CVE-2023-23916.patch
Normal file
231
meta/recipes-support/curl/curl/CVE-2023-23916.patch
Normal file
@@ -0,0 +1,231 @@
|
||||
From 119fb187192a9ea13dc90d9d20c215fc82799ab9 Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Monnerat <patrick@monnerat.net>
|
||||
Date: Mon, 13 Feb 2023 08:33:09 +0100
|
||||
Subject: [PATCH] content_encoding: do not reset stage counter for each header
|
||||
|
||||
Test 418 verifies
|
||||
|
||||
Closes #10492
|
||||
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/119fb187192a9ea13dc90d9d20c215fc82799ab9]
|
||||
CVE: CVE-2023-23916
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
lib/content_encoding.c | 7 +-
|
||||
lib/urldata.h | 1 +
|
||||
tests/data/Makefile.inc | 2 +-
|
||||
tests/data/test418 | 152 ++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 157 insertions(+), 5 deletions(-)
|
||||
create mode 100644 tests/data/test418
|
||||
|
||||
diff --git a/lib/content_encoding.c b/lib/content_encoding.c
|
||||
index 91e621f..7e098a5 100644
|
||||
--- a/lib/content_encoding.c
|
||||
+++ b/lib/content_encoding.c
|
||||
@@ -944,7 +944,6 @@ CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
|
||||
{
|
||||
struct Curl_easy *data = conn->data;
|
||||
struct SingleRequest *k = &data->req;
|
||||
- int counter = 0;
|
||||
|
||||
do {
|
||||
const char *name;
|
||||
@@ -979,9 +978,9 @@ CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
|
||||
if(!encoding)
|
||||
encoding = &error_encoding; /* Defer error at stack use. */
|
||||
|
||||
- if(++counter >= MAX_ENCODE_STACK) {
|
||||
- failf(data, "Reject response due to %u content encodings",
|
||||
- counter);
|
||||
+ if(k->writer_stack_depth++ >= MAX_ENCODE_STACK) {
|
||||
+ failf(data, "Reject response due to more than %u content encodings",
|
||||
+ MAX_ENCODE_STACK);
|
||||
return CURLE_BAD_CONTENT_ENCODING;
|
||||
}
|
||||
/* Stack the unencoding stage. */
|
||||
diff --git a/lib/urldata.h b/lib/urldata.h
|
||||
index ad0ef8f..168f874 100644
|
||||
--- a/lib/urldata.h
|
||||
+++ b/lib/urldata.h
|
||||
@@ -648,6 +648,7 @@ struct SingleRequest {
|
||||
#ifndef CURL_DISABLE_DOH
|
||||
struct dohdata doh; /* DoH specific data for this request */
|
||||
#endif
|
||||
+ unsigned char writer_stack_depth; /* Unencoding stack depth. */
|
||||
BIT(header); /* incoming data has HTTP header */
|
||||
BIT(content_range); /* set TRUE if Content-Range: was found */
|
||||
BIT(upload_done); /* set to TRUE when doing chunked transfer-encoding
|
||||
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
|
||||
index 60e8176..40de8bc 100644
|
||||
--- a/tests/data/Makefile.inc
|
||||
+++ b/tests/data/Makefile.inc
|
||||
@@ -63,7 +63,7 @@ test350 test351 test352 test353 test354 test355 test356 test357 \
|
||||
test393 test394 test395 \
|
||||
\
|
||||
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
|
||||
-test409 \
|
||||
+test409 test418 \
|
||||
\
|
||||
test490 test491 test492 \
|
||||
\
|
||||
diff --git a/tests/data/test418 b/tests/data/test418
|
||||
new file mode 100644
|
||||
index 0000000..50e974e
|
||||
--- /dev/null
|
||||
+++ b/tests/data/test418
|
||||
@@ -0,0 +1,152 @@
|
||||
+<testcase>
|
||||
+<info>
|
||||
+<keywords>
|
||||
+HTTP
|
||||
+gzip
|
||||
+</keywords>
|
||||
+</info>
|
||||
+
|
||||
+#
|
||||
+# Server-side
|
||||
+<reply>
|
||||
+<data nocheck="yes">
|
||||
+HTTP/1.1 200 OK
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+Transfer-Encoding: gzip
|
||||
+
|
||||
+-foo-
|
||||
+</data>
|
||||
+</reply>
|
||||
+
|
||||
+#
|
||||
+# Client-side
|
||||
+<client>
|
||||
+<server>
|
||||
+http
|
||||
+</server>
|
||||
+ <name>
|
||||
+Response with multiple Transfer-Encoding headers
|
||||
+ </name>
|
||||
+ <command>
|
||||
+http://%HOSTIP:%HTTPPORT/%TESTNUMBER -sS
|
||||
+</command>
|
||||
+</client>
|
||||
+
|
||||
+#
|
||||
+# Verify data after the test has been "shot"
|
||||
+<verify>
|
||||
+<protocol crlf="yes">
|
||||
+GET /%TESTNUMBER HTTP/1.1
|
||||
+Host: %HOSTIP:%HTTPPORT
|
||||
+User-Agent: curl/%VERSION
|
||||
+Accept: */*
|
||||
+
|
||||
+</protocol>
|
||||
+
|
||||
+# CURLE_BAD_CONTENT_ENCODING is 61
|
||||
+<errorcode>
|
||||
+61
|
||||
+</errorcode>
|
||||
+<stderr mode="text">
|
||||
+curl: (61) Reject response due to more than 5 content encodings
|
||||
+</stderr>
|
||||
+</verify>
|
||||
+</testcase>
|
||||
--
|
||||
2.25.1
|
||||
|
||||
59
meta/recipes-support/curl/curl/CVE-2023-27533.patch
Normal file
59
meta/recipes-support/curl/curl/CVE-2023-27533.patch
Normal file
@@ -0,0 +1,59 @@
|
||||
Backport of:
|
||||
|
||||
From 538b1e79a6e7b0bb829ab4cecc828d32105d0684 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Mon, 6 Mar 2023 12:07:33 +0100
|
||||
Subject: [PATCH] telnet: only accept option arguments in ascii
|
||||
|
||||
To avoid embedded telnet negotiation commands etc.
|
||||
|
||||
Reported-by: Harry Sintonen
|
||||
Closes #10728
|
||||
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/curl/tree/debian/patches/CVE-2023-27533.patch?h=ubuntu/focal-security
|
||||
Upstream commit https://github.com/curl/curl/commit/538b1e79a6e7b0bb829ab4cecc828d32105d0684]
|
||||
CVE: CVE-2023-27533
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/telnet.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/lib/telnet.c
|
||||
+++ b/lib/telnet.c
|
||||
@@ -815,6 +815,17 @@ static void printsub(struct Curl_easy *d
|
||||
}
|
||||
}
|
||||
|
||||
+static bool str_is_nonascii(const char *str)
|
||||
+{
|
||||
+ size_t len = strlen(str);
|
||||
+ while(len--) {
|
||||
+ if(*str & 0x80)
|
||||
+ return TRUE;
|
||||
+ str++;
|
||||
+ }
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
static CURLcode check_telnet_options(struct connectdata *conn)
|
||||
{
|
||||
struct curl_slist *head;
|
||||
@@ -829,6 +840,8 @@ static CURLcode check_telnet_options(str
|
||||
/* Add the user name as an environment variable if it
|
||||
was given on the command line */
|
||||
if(conn->bits.user_passwd) {
|
||||
+ if(str_is_nonascii(data->conn->user))
|
||||
+ return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
msnprintf(option_arg, sizeof(option_arg), "USER,%s", conn->user);
|
||||
beg = curl_slist_append(tn->telnet_vars, option_arg);
|
||||
if(!beg) {
|
||||
@@ -844,6 +857,9 @@ static CURLcode check_telnet_options(str
|
||||
if(sscanf(head->data, "%127[^= ]%*[ =]%255s",
|
||||
option_keyword, option_arg) == 2) {
|
||||
|
||||
+ if(str_is_nonascii(option_arg))
|
||||
+ continue;
|
||||
+
|
||||
/* Terminal type */
|
||||
if(strcasecompare(option_keyword, "TTYPE")) {
|
||||
strncpy(tn->subopt_ttype, option_arg, 31);
|
||||
123
meta/recipes-support/curl/curl/CVE-2023-27534.patch
Normal file
123
meta/recipes-support/curl/curl/CVE-2023-27534.patch
Normal file
@@ -0,0 +1,123 @@
|
||||
From 4e2b52b5f7a3bf50a0f1494155717b02cc1df6d6 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Thu, 9 Mar 2023 16:22:11 +0100
|
||||
Subject: [PATCH] curl_path: create the new path with dynbuf
|
||||
|
||||
CVE: CVE-2023-27534
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/4e2b52b5f7a3bf50a0f1494155717b02cc1df6d6]
|
||||
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
lib/curl_path.c | 71 ++++++++++++++++++++++++-------------------------
|
||||
1 file changed, 35 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/lib/curl_path.c b/lib/curl_path.c
|
||||
index f429634..e17db4b 100644
|
||||
--- a/lib/curl_path.c
|
||||
+++ b/lib/curl_path.c
|
||||
@@ -30,6 +30,8 @@
|
||||
#include "escape.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
+#define MAX_SSHPATH_LEN 100000 /* arbitrary */
|
||||
+
|
||||
/* figure out the path to work with in this particular request */
|
||||
CURLcode Curl_getworkingpath(struct connectdata *conn,
|
||||
char *homedir, /* when SFTP is used */
|
||||
@@ -37,60 +39,57 @@ CURLcode Curl_getworkingpath(struct connectdata *conn,
|
||||
real path to work with */
|
||||
{
|
||||
struct Curl_easy *data = conn->data;
|
||||
- char *real_path = NULL;
|
||||
char *working_path;
|
||||
size_t working_path_len;
|
||||
+ struct dynbuf npath;
|
||||
CURLcode result =
|
||||
Curl_urldecode(data, data->state.up.path, 0, &working_path,
|
||||
&working_path_len, FALSE);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
+ /* new path to switch to in case we need to */
|
||||
+ Curl_dyn_init(&npath, MAX_SSHPATH_LEN);
|
||||
+
|
||||
/* Check for /~/, indicating relative to the user's home directory */
|
||||
- if(conn->handler->protocol & CURLPROTO_SCP) {
|
||||
- real_path = malloc(working_path_len + 1);
|
||||
- if(real_path == NULL) {
|
||||
+ if((data->conn->handler->protocol & CURLPROTO_SCP) &&
|
||||
+ (working_path_len > 3) && (!memcmp(working_path, "/~/", 3))) {
|
||||
+ /* It is referenced to the home directory, so strip the leading '/~/' */
|
||||
+ if(Curl_dyn_addn(&npath, &working_path[3], working_path_len - 3)) {
|
||||
free(working_path);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
- if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
|
||||
- /* It is referenced to the home directory, so strip the leading '/~/' */
|
||||
- memcpy(real_path, working_path + 3, working_path_len - 2);
|
||||
- else
|
||||
- memcpy(real_path, working_path, 1 + working_path_len);
|
||||
}
|
||||
- else if(conn->handler->protocol & CURLPROTO_SFTP) {
|
||||
- if((working_path_len > 1) && (working_path[1] == '~')) {
|
||||
- size_t homelen = strlen(homedir);
|
||||
- real_path = malloc(homelen + working_path_len + 1);
|
||||
- if(real_path == NULL) {
|
||||
- free(working_path);
|
||||
- return CURLE_OUT_OF_MEMORY;
|
||||
- }
|
||||
- /* It is referenced to the home directory, so strip the
|
||||
- leading '/' */
|
||||
- memcpy(real_path, homedir, homelen);
|
||||
- real_path[homelen] = '/';
|
||||
- real_path[homelen + 1] = '\0';
|
||||
- if(working_path_len > 3) {
|
||||
- memcpy(real_path + homelen + 1, working_path + 3,
|
||||
- 1 + working_path_len -3);
|
||||
- }
|
||||
+ else if((data->conn->handler->protocol & CURLPROTO_SFTP) &&
|
||||
+ (working_path_len > 2) && !memcmp(working_path, "/~/", 3)) {
|
||||
+ size_t len;
|
||||
+ const char *p;
|
||||
+ int copyfrom = 3;
|
||||
+ if(Curl_dyn_add(&npath, homedir)) {
|
||||
+ free(working_path);
|
||||
+ return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
- else {
|
||||
- real_path = malloc(working_path_len + 1);
|
||||
- if(real_path == NULL) {
|
||||
- free(working_path);
|
||||
- return CURLE_OUT_OF_MEMORY;
|
||||
- }
|
||||
- memcpy(real_path, working_path, 1 + working_path_len);
|
||||
+ /* Copy a separating '/' if homedir does not end with one */
|
||||
+ len = Curl_dyn_len(&npath);
|
||||
+ p = Curl_dyn_ptr(&npath);
|
||||
+ if(len && (p[len-1] != '/'))
|
||||
+ copyfrom = 2;
|
||||
+
|
||||
+ if(Curl_dyn_addn(&npath,
|
||||
+ &working_path[copyfrom], working_path_len - copyfrom)) {
|
||||
+ free(working_path);
|
||||
+ return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
- free(working_path);
|
||||
+ if(Curl_dyn_len(&npath)) {
|
||||
+ free(working_path);
|
||||
|
||||
- /* store the pointer for the caller to receive */
|
||||
- *path = real_path;
|
||||
+ /* store the pointer for the caller to receive */
|
||||
+ *path = Curl_dyn_ptr(&npath);
|
||||
+ }
|
||||
+ else
|
||||
+ *path = working_path;
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
236
meta/recipes-support/curl/curl/CVE-2023-27535-pre1.patch
Normal file
236
meta/recipes-support/curl/curl/CVE-2023-27535-pre1.patch
Normal file
@@ -0,0 +1,236 @@
|
||||
From ed5095ed94281989e103c72e032200b83be37878 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Thu, 6 Oct 2022 00:49:10 +0200
|
||||
Subject: [PATCH] strcase: add and use Curl_timestrcmp
|
||||
|
||||
This is a strcmp() alternative function for comparing "secrets",
|
||||
designed to take the same time no matter the content to not leak
|
||||
match/non-match info to observers based on how fast it is.
|
||||
|
||||
The time this function takes is only a function of the shortest input
|
||||
string.
|
||||
|
||||
Reported-by: Trail of Bits
|
||||
|
||||
Closes #9658
|
||||
|
||||
Upstream-Status: Backport from [https://github.com/curl/curl/commit/ed5095ed94281989e103c72e032200b83be37878 & https://github.com/curl/curl/commit/f18af4f874cecab82a9797e8c7541e0990c7a64c]
|
||||
Comment: to backport fix for CVE-2023-27535, add function Curl_timestrcmp.
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/netrc.c | 6 +++---
|
||||
lib/strcase.c | 22 ++++++++++++++++++++++
|
||||
lib/strcase.h | 1 +
|
||||
lib/url.c | 33 +++++++++++++--------------------
|
||||
lib/vauth/digest_sspi.c | 4 ++--
|
||||
lib/vtls/vtls.c | 21 ++++++++++++++++++++-
|
||||
6 files changed, 61 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/lib/netrc.c b/lib/netrc.c
|
||||
index 9323913..fe3fd1e 100644
|
||||
--- a/lib/netrc.c
|
||||
+++ b/lib/netrc.c
|
||||
@@ -124,9 +124,9 @@ static int parsenetrc(const char *host,
|
||||
/* we are now parsing sub-keywords concerning "our" host */
|
||||
if(state_login) {
|
||||
if(specific_login) {
|
||||
- state_our_login = strcasecompare(login, tok);
|
||||
+ state_our_login = !Curl_timestrcmp(login, tok);
|
||||
}
|
||||
- else if(!login || strcmp(login, tok)) {
|
||||
+ else if(!login || Curl_timestrcmp(login, tok)) {
|
||||
if(login_alloc) {
|
||||
free(login);
|
||||
login_alloc = FALSE;
|
||||
@@ -142,7 +142,7 @@ static int parsenetrc(const char *host,
|
||||
}
|
||||
else if(state_password) {
|
||||
if((state_our_login || !specific_login)
|
||||
- && (!password || strcmp(password, tok))) {
|
||||
+ && (!password || Curl_timestrcmp(password, tok))) {
|
||||
if(password_alloc) {
|
||||
free(password);
|
||||
password_alloc = FALSE;
|
||||
diff --git a/lib/strcase.c b/lib/strcase.c
|
||||
index 70bf21c..ec776b3 100644
|
||||
--- a/lib/strcase.c
|
||||
+++ b/lib/strcase.c
|
||||
@@ -261,6 +261,28 @@ bool Curl_safecmp(char *a, char *b)
|
||||
return !a && !b;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Curl_timestrcmp() returns 0 if the two strings are identical. The time this
|
||||
+ * function spends is a function of the shortest string, not of the contents.
|
||||
+ */
|
||||
+int Curl_timestrcmp(const char *a, const char *b)
|
||||
+{
|
||||
+ int match = 0;
|
||||
+ int i = 0;
|
||||
+
|
||||
+ if(a && b) {
|
||||
+ while(1) {
|
||||
+ match |= a[i]^b[i];
|
||||
+ if(!a[i] || !b[i])
|
||||
+ break;
|
||||
+ i++;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ return a || b;
|
||||
+ return match;
|
||||
+}
|
||||
+
|
||||
/* --- public functions --- */
|
||||
|
||||
int curl_strequal(const char *first, const char *second)
|
||||
diff --git a/lib/strcase.h b/lib/strcase.h
|
||||
index 8929a53..8077108 100644
|
||||
--- a/lib/strcase.h
|
||||
+++ b/lib/strcase.h
|
||||
@@ -49,5 +49,6 @@ void Curl_strntoupper(char *dest, const char *src, size_t n);
|
||||
void Curl_strntolower(char *dest, const char *src, size_t n);
|
||||
|
||||
bool Curl_safecmp(char *a, char *b);
|
||||
+int Curl_timestrcmp(const char *first, const char *second);
|
||||
|
||||
#endif /* HEADER_CURL_STRCASE_H */
|
||||
diff --git a/lib/url.c b/lib/url.c
|
||||
index 9f14a7b..dfbde3b 100644
|
||||
--- a/lib/url.c
|
||||
+++ b/lib/url.c
|
||||
@@ -886,19 +886,10 @@ socks_proxy_info_matches(const struct proxy_info* data,
|
||||
/* the user information is case-sensitive
|
||||
or at least it is not defined as case-insensitive
|
||||
see https://tools.ietf.org/html/rfc3986#section-3.2.1 */
|
||||
- if((data->user == NULL) != (needle->user == NULL))
|
||||
- return FALSE;
|
||||
- /* curl_strequal does a case insentive comparison, so do not use it here! */
|
||||
- if(data->user &&
|
||||
- needle->user &&
|
||||
- strcmp(data->user, needle->user) != 0)
|
||||
- return FALSE;
|
||||
- if((data->passwd == NULL) != (needle->passwd == NULL))
|
||||
- return FALSE;
|
||||
+
|
||||
/* curl_strequal does a case insentive comparison, so do not use it here! */
|
||||
- if(data->passwd &&
|
||||
- needle->passwd &&
|
||||
- strcmp(data->passwd, needle->passwd) != 0)
|
||||
+ if(Curl_timestrcmp(data->user, needle->user) ||
|
||||
+ Curl_timestrcmp(data->passwd, needle->passwd))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1257,10 +1248,10 @@ ConnectionExists(struct Curl_easy *data,
|
||||
if(!(needle->handler->flags & PROTOPT_CREDSPERREQUEST)) {
|
||||
/* This protocol requires credentials per connection,
|
||||
so verify that we're using the same name and password as well */
|
||||
- if(strcmp(needle->user, check->user) ||
|
||||
- strcmp(needle->passwd, check->passwd) ||
|
||||
- !Curl_safecmp(needle->sasl_authzid, check->sasl_authzid) ||
|
||||
- !Curl_safecmp(needle->oauth_bearer, check->oauth_bearer)) {
|
||||
+ if(Curl_timestrcmp(needle->user, check->user) ||
|
||||
+ Curl_timestrcmp(needle->passwd, check->passwd) ||
|
||||
+ Curl_timestrcmp(needle->sasl_authzid, check->sasl_authzid) ||
|
||||
+ Curl_timestrcmp(needle->oauth_bearer, check->oauth_bearer)) {
|
||||
/* one of them was different */
|
||||
continue;
|
||||
}
|
||||
@@ -1326,8 +1317,8 @@ ConnectionExists(struct Curl_easy *data,
|
||||
possible. (Especially we must not reuse the same connection if
|
||||
partway through a handshake!) */
|
||||
if(wantNTLMhttp) {
|
||||
- if(strcmp(needle->user, check->user) ||
|
||||
- strcmp(needle->passwd, check->passwd)) {
|
||||
+ if(Curl_timestrcmp(needle->user, check->user) ||
|
||||
+ Curl_timestrcmp(needle->passwd, check->passwd)) {
|
||||
|
||||
/* we prefer a credential match, but this is at least a connection
|
||||
that can be reused and "upgraded" to NTLM */
|
||||
@@ -1348,8 +1339,10 @@ ConnectionExists(struct Curl_easy *data,
|
||||
if(!check->http_proxy.user || !check->http_proxy.passwd)
|
||||
continue;
|
||||
|
||||
- if(strcmp(needle->http_proxy.user, check->http_proxy.user) ||
|
||||
- strcmp(needle->http_proxy.passwd, check->http_proxy.passwd))
|
||||
+ if(Curl_timestrcmp(needle->http_proxy.user,
|
||||
+ check->http_proxy.user) ||
|
||||
+ Curl_timestrcmp(needle->http_proxy.passwd,
|
||||
+ check->http_proxy.passwd))
|
||||
continue;
|
||||
}
|
||||
else if(check->proxy_ntlm_state != NTLMSTATE_NONE) {
|
||||
diff --git a/lib/vauth/digest_sspi.c b/lib/vauth/digest_sspi.c
|
||||
index a109056..3986386 100644
|
||||
--- a/lib/vauth/digest_sspi.c
|
||||
+++ b/lib/vauth/digest_sspi.c
|
||||
@@ -450,8 +450,8 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
||||
has changed then delete that context. */
|
||||
if((userp && !digest->user) || (!userp && digest->user) ||
|
||||
(passwdp && !digest->passwd) || (!passwdp && digest->passwd) ||
|
||||
- (userp && digest->user && strcmp(userp, digest->user)) ||
|
||||
- (passwdp && digest->passwd && strcmp(passwdp, digest->passwd))) {
|
||||
+ (userp && digest->user && Curl_timestrcmp(userp, digest->user)) ||
|
||||
+ (passwdp && digest->passwd && Curl_timestrcmp(passwdp, digest->passwd))) {
|
||||
if(digest->http_context) {
|
||||
s_pSecFn->DeleteSecurityContext(digest->http_context);
|
||||
Curl_safefree(digest->http_context);
|
||||
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
|
||||
index e8cb70f..70a9391 100644
|
||||
--- a/lib/vtls/vtls.c
|
||||
+++ b/lib/vtls/vtls.c
|
||||
@@ -98,9 +98,15 @@ Curl_ssl_config_matches(struct ssl_primary_config* data,
|
||||
Curl_safecmp(data->issuercert, needle->issuercert) &&
|
||||
Curl_safecmp(data->clientcert, needle->clientcert) &&
|
||||
Curl_safecmp(data->random_file, needle->random_file) &&
|
||||
- Curl_safecmp(data->egdsocket, needle->egdsocket) &&
|
||||
+ Curl_safecmp(data->egdsocket, needle->egdsocket) &&
|
||||
+#ifdef USE_TLS_SRP
|
||||
+ !Curl_timestrcmp(data->username, needle->username) &&
|
||||
+ !Curl_timestrcmp(data->password, needle->password) &&
|
||||
+ (data->authtype == needle->authtype) &&
|
||||
+#endif
|
||||
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
|
||||
Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
|
||||
+ Curl_safe_strcasecompare(data->CRLfile, needle->CRLfile) &&
|
||||
Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
|
||||
return TRUE;
|
||||
|
||||
@@ -117,6 +123,9 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
|
||||
dest->verifyhost = source->verifyhost;
|
||||
dest->verifystatus = source->verifystatus;
|
||||
dest->sessionid = source->sessionid;
|
||||
+#ifdef USE_TLS_SRP
|
||||
+ dest->authtype = source->authtype;
|
||||
+#endif
|
||||
|
||||
CLONE_STRING(CApath);
|
||||
CLONE_STRING(CAfile);
|
||||
@@ -127,6 +136,11 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
|
||||
CLONE_STRING(cipher_list);
|
||||
CLONE_STRING(cipher_list13);
|
||||
CLONE_STRING(pinned_key);
|
||||
+ CLONE_STRING(CRLfile);
|
||||
+#ifdef USE_TLS_SRP
|
||||
+ CLONE_STRING(username);
|
||||
+ CLONE_STRING(password);
|
||||
+#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -142,6 +156,11 @@ void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc)
|
||||
Curl_safefree(sslc->cipher_list);
|
||||
Curl_safefree(sslc->cipher_list13);
|
||||
Curl_safefree(sslc->pinned_key);
|
||||
+ Curl_safefree(sslc->CRLfile);
|
||||
+#ifdef USE_TLS_SRP
|
||||
+ Curl_safefree(sslc->username);
|
||||
+ Curl_safefree(sslc->password);
|
||||
+#endif
|
||||
}
|
||||
|
||||
#ifdef USE_SSL
|
||||
--
|
||||
2.25.1
|
||||
|
||||
170
meta/recipes-support/curl/curl/CVE-2023-27535.patch
Normal file
170
meta/recipes-support/curl/curl/CVE-2023-27535.patch
Normal file
@@ -0,0 +1,170 @@
|
||||
From 8f4608468b890dce2dad9f91d5607ee7e9c1aba1 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Thu, 9 Mar 2023 17:47:06 +0100
|
||||
Subject: [PATCH] ftp: add more conditions for connection reuse
|
||||
|
||||
Reported-by: Harry Sintonen
|
||||
Closes #10730
|
||||
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/curl/tree/debian/patches/CVE-2023-27535.patch?h=ubuntu/focal-security
|
||||
Upstream commit https://github.com/curl/curl/commit/8f4608468b890dce2dad9f91d5607ee7e9c1aba1]
|
||||
CVE: CVE-2023-27535
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/ftp.c | 30 ++++++++++++++++++++++++++++--
|
||||
lib/ftp.h | 5 +++++
|
||||
lib/setopt.c | 2 +-
|
||||
lib/url.c | 16 +++++++++++++++-
|
||||
lib/urldata.h | 4 ++--
|
||||
5 files changed, 51 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/lib/ftp.c b/lib/ftp.c
|
||||
index 31a34e8..7a82a74 100644
|
||||
--- a/lib/ftp.c
|
||||
+++ b/lib/ftp.c
|
||||
@@ -4059,6 +4059,10 @@ static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection)
|
||||
}
|
||||
|
||||
freedirs(ftpc);
|
||||
+ free(ftpc->account);
|
||||
+ ftpc->account = NULL;
|
||||
+ free(ftpc->alternative_to_user);
|
||||
+ ftpc->alternative_to_user = NULL;
|
||||
free(ftpc->prevpath);
|
||||
ftpc->prevpath = NULL;
|
||||
free(ftpc->server_os);
|
||||
@@ -4326,11 +4330,31 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
|
||||
struct Curl_easy *data = conn->data;
|
||||
char *type;
|
||||
struct FTP *ftp;
|
||||
+ struct ftp_conn *ftpc = &conn->proto.ftpc;
|
||||
|
||||
- conn->data->req.protop = ftp = calloc(sizeof(struct FTP), 1);
|
||||
+ ftp = calloc(sizeof(struct FTP), 1);
|
||||
if(NULL == ftp)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
+ /* clone connection related data that is FTP specific */
|
||||
+ if(data->set.str[STRING_FTP_ACCOUNT]) {
|
||||
+ ftpc->account = strdup(data->set.str[STRING_FTP_ACCOUNT]);
|
||||
+ if(!ftpc->account) {
|
||||
+ free(ftp);
|
||||
+ return CURLE_OUT_OF_MEMORY;
|
||||
+ }
|
||||
+ }
|
||||
+ if(data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]) {
|
||||
+ ftpc->alternative_to_user =
|
||||
+ strdup(data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]);
|
||||
+ if(!ftpc->alternative_to_user) {
|
||||
+ Curl_safefree(ftpc->account);
|
||||
+ free(ftp);
|
||||
+ return CURLE_OUT_OF_MEMORY;
|
||||
+ }
|
||||
+ }
|
||||
+ conn->data->req.protop = ftp;
|
||||
+
|
||||
ftp->path = &data->state.up.path[1]; /* don't include the initial slash */
|
||||
|
||||
/* FTP URLs support an extension like ";type=<typecode>" that
|
||||
@@ -4366,7 +4390,9 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
|
||||
/* get some initial data into the ftp struct */
|
||||
ftp->transfer = FTPTRANSFER_BODY;
|
||||
ftp->downloadsize = 0;
|
||||
- conn->proto.ftpc.known_filesize = -1; /* unknown size for now */
|
||||
+ ftpc->known_filesize = -1; /* unknown size for now */
|
||||
+ ftpc->use_ssl = data->set.use_ssl;
|
||||
+ ftpc->ccc = data->set.ftp_ccc;
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
diff --git a/lib/ftp.h b/lib/ftp.h
|
||||
index 984347f..163dcb3 100644
|
||||
--- a/lib/ftp.h
|
||||
+++ b/lib/ftp.h
|
||||
@@ -116,6 +116,8 @@ struct FTP {
|
||||
struct */
|
||||
struct ftp_conn {
|
||||
struct pingpong pp;
|
||||
+ char *account;
|
||||
+ char *alternative_to_user;
|
||||
char *entrypath; /* the PWD reply when we logged on */
|
||||
char **dirs; /* realloc()ed array for path components */
|
||||
int dirdepth; /* number of entries used in the 'dirs' array */
|
||||
@@ -141,6 +143,9 @@ struct ftp_conn {
|
||||
ftpstate state; /* always use ftp.c:state() to change state! */
|
||||
ftpstate state_saved; /* transfer type saved to be reloaded after
|
||||
data connection is established */
|
||||
+ unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
|
||||
+ IMAP or POP3 or others! (type: curl_usessl)*/
|
||||
+ unsigned char ccc; /* ccc level for this connection */
|
||||
curl_off_t retr_size_saved; /* Size of retrieved file saved */
|
||||
char *server_os; /* The target server operating system. */
|
||||
curl_off_t known_filesize; /* file size is different from -1, if wildcard
|
||||
diff --git a/lib/setopt.c b/lib/setopt.c
|
||||
index 4d96f6b..a91bb70 100644
|
||||
--- a/lib/setopt.c
|
||||
+++ b/lib/setopt.c
|
||||
@@ -2126,7 +2126,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
|
||||
arg = va_arg(param, long);
|
||||
if((arg < CURLUSESSL_NONE) || (arg >= CURLUSESSL_LAST))
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
- data->set.use_ssl = (curl_usessl)arg;
|
||||
+ data->set.use_ssl = (unsigned char)arg;
|
||||
break;
|
||||
|
||||
case CURLOPT_SSL_OPTIONS:
|
||||
diff --git a/lib/url.c b/lib/url.c
|
||||
index dfbde3b..f84375c 100644
|
||||
--- a/lib/url.c
|
||||
+++ b/lib/url.c
|
||||
@@ -1257,10 +1257,24 @@ ConnectionExists(struct Curl_easy *data,
|
||||
}
|
||||
}
|
||||
|
||||
- if(get_protocol_family(needle->handler->protocol) & PROTO_FAMILY_SSH) {
|
||||
+#ifdef USE_SSH
|
||||
+ else if(get_protocol_family(needle->handler->protocol) & PROTO_FAMILY_SSH) {
|
||||
if(!ssh_config_matches(needle, check))
|
||||
continue;
|
||||
}
|
||||
+#endif
|
||||
+#ifndef CURL_DISABLE_FTP
|
||||
+ else if(get_protocol_family(needle->handler->protocol) & PROTO_FAMILY_FTP) {
|
||||
+ /* Also match ACCOUNT, ALTERNATIVE-TO-USER, USE_SSL and CCC options */
|
||||
+ if(Curl_timestrcmp(needle->proto.ftpc.account,
|
||||
+ check->proto.ftpc.account) ||
|
||||
+ Curl_timestrcmp(needle->proto.ftpc.alternative_to_user,
|
||||
+ check->proto.ftpc.alternative_to_user) ||
|
||||
+ (needle->proto.ftpc.use_ssl != check->proto.ftpc.use_ssl) ||
|
||||
+ (needle->proto.ftpc.ccc != check->proto.ftpc.ccc))
|
||||
+ continue;
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
if(!needle->bits.httpproxy || (needle->handler->flags&PROTOPT_SSL) ||
|
||||
needle->bits.tunnel_proxy) {
|
||||
diff --git a/lib/urldata.h b/lib/urldata.h
|
||||
index 168f874..51b793b 100644
|
||||
--- a/lib/urldata.h
|
||||
+++ b/lib/urldata.h
|
||||
@@ -1730,8 +1730,6 @@ struct UserDefined {
|
||||
void *ssh_keyfunc_userp; /* custom pointer to callback */
|
||||
enum CURL_NETRC_OPTION
|
||||
use_netrc; /* defined in include/curl.h */
|
||||
- curl_usessl use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
|
||||
- IMAP or POP3 or others! */
|
||||
long new_file_perms; /* Permissions to use when creating remote files */
|
||||
long new_directory_perms; /* Permissions to use when creating remote dirs */
|
||||
long ssh_auth_types; /* allowed SSH auth types */
|
||||
@@ -1851,6 +1849,8 @@ struct UserDefined {
|
||||
BIT(http09_allowed); /* allow HTTP/0.9 responses */
|
||||
BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some
|
||||
recipients */
|
||||
+ unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
|
||||
+ IMAP or POP3 or others! (type: curl_usessl)*/
|
||||
};
|
||||
|
||||
struct Names {
|
||||
--
|
||||
2.25.1
|
||||
|
||||
55
meta/recipes-support/curl/curl/CVE-2023-27536.patch
Normal file
55
meta/recipes-support/curl/curl/CVE-2023-27536.patch
Normal file
@@ -0,0 +1,55 @@
|
||||
From cb49e67303dbafbab1cebf4086e3ec15b7d56ee5 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Fri, 10 Mar 2023 09:22:43 +0100
|
||||
Subject: [PATCH] url: only reuse connections with same GSS delegation
|
||||
|
||||
Reported-by: Harry Sintonen
|
||||
Closes #10731
|
||||
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/cb49e67303dbafbab1cebf4086e3ec15b7d56ee5]
|
||||
CVE: CVE-2023-27536
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/url.c | 6 ++++++
|
||||
lib/urldata.h | 1 +
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/lib/url.c b/lib/url.c
|
||||
index f84375c..87f4eb0 100644
|
||||
--- a/lib/url.c
|
||||
+++ b/lib/url.c
|
||||
@@ -1257,6 +1257,11 @@ ConnectionExists(struct Curl_easy *data,
|
||||
}
|
||||
}
|
||||
|
||||
+ /* GSS delegation differences do not actually affect every connection
|
||||
+ and auth method, but this check takes precaution before efficiency */
|
||||
+ if(needle->gssapi_delegation != check->gssapi_delegation)
|
||||
+ continue;
|
||||
+
|
||||
#ifdef USE_SSH
|
||||
else if(get_protocol_family(needle->handler->protocol) & PROTO_FAMILY_SSH) {
|
||||
if(!ssh_config_matches(needle, check))
|
||||
@@ -1708,6 +1713,7 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
|
||||
conn->fclosesocket = data->set.fclosesocket;
|
||||
conn->closesocket_client = data->set.closesocket_client;
|
||||
conn->lastused = Curl_now(); /* used now */
|
||||
+ conn->gssapi_delegation = data->set.gssapi_delegation;
|
||||
|
||||
return conn;
|
||||
error:
|
||||
diff --git a/lib/urldata.h b/lib/urldata.h
|
||||
index 51b793b..b8a611b 100644
|
||||
--- a/lib/urldata.h
|
||||
+++ b/lib/urldata.h
|
||||
@@ -1118,6 +1118,7 @@ struct connectdata {
|
||||
handle */
|
||||
BIT(sock_accepted); /* TRUE if the SECONDARYSOCKET was created with
|
||||
accept() */
|
||||
+ long gssapi_delegation; /* inherited from set.gssapi_delegation */
|
||||
};
|
||||
|
||||
/* The end of connectdata. */
|
||||
--
|
||||
2.25.1
|
||||
|
||||
31
meta/recipes-support/curl/curl/CVE-2023-27538.patch
Normal file
31
meta/recipes-support/curl/curl/CVE-2023-27538.patch
Normal file
@@ -0,0 +1,31 @@
|
||||
From af369db4d3833272b8ed443f7fcc2e757a0872eb Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Fri, 10 Mar 2023 08:22:51 +0100
|
||||
Subject: [PATCH] url: fix the SSH connection reuse check
|
||||
|
||||
Reported-by: Harry Sintonen
|
||||
Closes #10735
|
||||
|
||||
CVE: CVE-2023-27538
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/af369db4d3833272b8ed443f7fcc2e757a0872eb]
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
lib/url.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/url.c b/lib/url.c
|
||||
index 8da0245..9f14a7b 100644
|
||||
--- a/lib/url.c
|
||||
+++ b/lib/url.c
|
||||
@@ -1266,7 +1266,7 @@ ConnectionExists(struct Curl_easy *data,
|
||||
}
|
||||
}
|
||||
|
||||
- if(get_protocol_family(needle->handler->protocol) == PROTO_FAMILY_SSH) {
|
||||
+ if(get_protocol_family(needle->handler->protocol) & PROTO_FAMILY_SSH) {
|
||||
if(!ssh_config_matches(needle, check))
|
||||
continue;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -42,6 +42,13 @@ SRC_URI = "https://curl.haxx.se/download/curl-${PV}.tar.bz2 \
|
||||
file://CVE-2022-32221.patch \
|
||||
file://CVE-2022-35260.patch \
|
||||
file://CVE-2022-43552.patch \
|
||||
file://CVE-2023-23916.patch \
|
||||
file://CVE-2023-27534.patch \
|
||||
file://CVE-2023-27538.patch \
|
||||
file://CVE-2023-27533.patch \
|
||||
file://CVE-2023-27535-pre1.patch \
|
||||
file://CVE-2023-27535.patch \
|
||||
file://CVE-2023-27536.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "ec5fc263f898a3dfef08e805f1ecca42"
|
||||
|
||||
47
meta/recipes-support/libksba/libksba/CVE-2022-3515.patch
Normal file
47
meta/recipes-support/libksba/libksba/CVE-2022-3515.patch
Normal file
@@ -0,0 +1,47 @@
|
||||
From 4b7d9cd4a018898d7714ce06f3faf2626c14582b Mon Sep 17 00:00:00 2001
|
||||
From: Werner Koch <wk@gnupg.org>
|
||||
Date: Wed, 5 Oct 2022 14:19:06 +0200
|
||||
Subject: [PATCH] Detect a possible overflow directly in the TLV parser.
|
||||
|
||||
* src/ber-help.c (_ksba_ber_read_tl): Check for overflow of a commonly
|
||||
used sum.
|
||||
--
|
||||
|
||||
It is quite common to have checks like
|
||||
|
||||
if (ti.nhdr + ti.length >= DIM(tmpbuf))
|
||||
return gpg_error (GPG_ERR_TOO_LARGE);
|
||||
|
||||
This patch detects possible integer overflows immmediately when
|
||||
creating the TI object.
|
||||
|
||||
Reported-by: ZDI-CAN-18927, ZDI-CAN-18928, ZDI-CAN-18929
|
||||
|
||||
|
||||
Upstream-Status: Backport [https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libksba.git;a=patch;h=4b7d9cd4a018898d7714ce06f3faf2626c14582b]
|
||||
CVE: CVE-2022-3515
|
||||
Signed-off-by: Chee Yang Lee <chee.yang.lee@intel.com>
|
||||
---
|
||||
src/ber-help.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/src/ber-help.c b/src/ber-help.c
|
||||
index 81c31ed..56efb6a 100644
|
||||
--- a/src/ber-help.c
|
||||
+++ b/src/ber-help.c
|
||||
@@ -182,6 +182,12 @@ _ksba_ber_read_tl (ksba_reader_t reader, struct tag_info *ti)
|
||||
ti->length = len;
|
||||
}
|
||||
|
||||
+ if (ti->length > ti->nhdr && (ti->nhdr + ti->length) < ti->length)
|
||||
+ {
|
||||
+ ti->err_string = "header+length would overflow";
|
||||
+ return gpg_error (GPG_ERR_EOVERFLOW);
|
||||
+ }
|
||||
+
|
||||
/* Without this kludge some example certs can't be parsed */
|
||||
if (ti->class == CLASS_UNIVERSAL && !ti->tag)
|
||||
ti->length = 0;
|
||||
--
|
||||
2.11.0
|
||||
|
||||
@@ -24,6 +24,7 @@ UPSTREAM_CHECK_URI = "https://gnupg.org/download/index.html"
|
||||
SRC_URI = "${GNUPG_MIRROR}/${BPN}/${BPN}-${PV}.tar.bz2 \
|
||||
file://ksba-add-pkgconfig-support.patch \
|
||||
file://CVE-2022-47629.patch \
|
||||
file://CVE-2022-3515.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "8302a3e263a7c630aa7dea7d341f07a2"
|
||||
|
||||
@@ -10,8 +10,7 @@ DEPENDS = "ncurses gettext-native"
|
||||
RSUGGESTS_${PN} = "diffutils"
|
||||
|
||||
LICENSE = "vim"
|
||||
LIC_FILES_CHKSUM = "file://LICENSE;md5=6b30ea4fa660c483b619924bc709ef99 \
|
||||
file://runtime/doc/uganda.txt;md5=001ef779f422a0e9106d428c84495b4d"
|
||||
LIC_FILES_CHKSUM = "file://LICENSE;md5=6b30ea4fa660c483b619924bc709ef99"
|
||||
|
||||
SRC_URI = "git://github.com/vim/vim.git;branch=master;protocol=https \
|
||||
file://disable_acl_header_check.patch \
|
||||
@@ -20,8 +19,8 @@ SRC_URI = "git://github.com/vim/vim.git;branch=master;protocol=https \
|
||||
file://no-path-adjust.patch \
|
||||
"
|
||||
|
||||
PV .= ".1293"
|
||||
SRCREV = "0caaf1e46511f7a92e036f05e6aa9d5992540117"
|
||||
PV .= ".1429"
|
||||
SRCREV = "1a08a3e2a584889f19b84a27672134649b73da58"
|
||||
|
||||
# Remove when 8.3 is out
|
||||
UPSTREAM_VERSION_UNKNOWN = "1"
|
||||
@@ -81,6 +80,7 @@ EXTRA_OECONF = " \
|
||||
--disable-netbeans \
|
||||
--disable-desktop-database-update \
|
||||
--with-tlib=ncurses \
|
||||
--with-modified-by='${MAINTAINER}' \
|
||||
ac_cv_small_wchar_t=no \
|
||||
ac_cv_path_GLIB_COMPILE_RESOURCES=no \
|
||||
vim_cv_getcwd_broken=no \
|
||||
|
||||
@@ -142,7 +142,7 @@ def generic_get_log(sectionname, results, section):
|
||||
return decode_log(ptest['log'])
|
||||
|
||||
def ptestresult_get_log(results, section):
|
||||
return generic_get_log('ptestresuls.sections', results, section)
|
||||
return generic_get_log('ptestresult.sections', results, section)
|
||||
|
||||
def generic_get_rawlogs(sectname, results):
|
||||
if sectname not in results:
|
||||
|
||||
@@ -128,7 +128,7 @@ class Trace:
|
||||
def compile(self, writer):
|
||||
|
||||
def find_parent_id_for(pid):
|
||||
if pid is 0:
|
||||
if pid == 0:
|
||||
return 0
|
||||
ppid = self.parent_map.get(pid)
|
||||
if ppid:
|
||||
|
||||
Reference in New Issue
Block a user