Some notes about Xalan-J Integer Truncation (CVE-2022–34169)

  • Trong đó với trường có tag id = 1, ứng với Utf8_info, bytes = AAA
  • Trường còn lại có tag id = 8, ứng với String_info, string_index = #92, chính là Utf8_info phía trên
  • Chèn thêm một số lượng Constant nhất định để khi Constant Pool length bị truncate sẽ trở thành Constant Pool length mong muốn, ví dụ như: 67330 & 0xFFFF = 1794
  • Khi đó tất cả số byte phía sau 1794 Constant Pool sẽ được reuse cho các trường access_flags, this_class, Code … đây cũng chính là số Constant mình đã overwrite phía trước
  • access_flags & Modifier != 0
  • 0x0807 & 0x0001 != 0
  • 0x0807 & ACC_INTERFACE & ACC_ABSTRACT & ACC_ANNOTATION & ACC_ENUM = 0
  • 0x??06
  • Side note:
  • methods[0].name_index: giá trị này có thể trỏ tới bất kỳ abstract Method nào của parent Class, trong exploit trên p0 cũng như trên noah, các tác giả đều sử dụng tới transferOutputSettings (thực ra là trỏ tới Utf8_info nào cũng đc) ở đây là #71 (0x0047)
  • methods[0].descriptor_index: cũng như trên, để không gây ra rắc rối thì mình sử dụng luôn descriptor_index của transferOutputSettings tại index #72 (0x0048)
  • methods[0].attributes_count: khai báo số lượng các attribute có trong method này
  • Tiếp tục với methods[0].attributes_count, vì method đầu tiên không được sử dụng vào mục đích gì nên sẽ chỉ cần một attribute để làm hợp lệ các dữ liệu phía sau đó.
  • Field tiếp theo cần xem xét là attribute_name_index,
  • Tiếp theo là attribute_length, dựa vào attribute_length có thể quyết định được bao nhiêu bytes phía sau sẽ được sử dụng
  • methods[1].name_index: trỏ tới Constant Utf8 có nội dung <init>, trong poc của thanat0s, tác giả đã tự khai báo Utf8 constant và refer tới:
  • methods[1].descriptor_index: trỏ tới ()V
  • methods[1].attributes_count = 0x0003, ở đây sử dụng tới 3 attribute để tạo thành method cuối cùng này
  • attributes[0]: được sử dụng để nuốt tag của Constant double
  • attributes[1]: được sử dụng để chứa Code attribute
  • attributes[2]: phần này sẽ được dùng để hợp pháp hóa tất cả các ký tự phía sau, bao gồm các thông tin của Class gốc cũng như các payload truncate
  • max_stack = 0x00FF: max stack của các operand
  • max_locals = 0x0600: kích thước cần thiết cho local variables, 0x0600 là hơi lớn so với thực tế, tuy nhiên vẫn cần 0x06 để làm tag id cho Constant double
  • exception_table_length = 0x0000
  • attributes_count = 0x0000: giá trị này chỉ dùng để làm Line Number cho code, không cần thiết phải sử dụng
  • May mắn là 0x00 có thể được sử dụng làm nop instruction,
  • Với tag id = 6 tương ứng với iconst_6, cần đi kèm với một lệnh istore để không bị chiếm mất stack, ở đây sẽ sử dụng tới istore_1.
  • Sử dụng tới ldc_w thay cho ldc để tăng phạm vi load Constant Pool
  • goto không cần thiết sử dụng tới vì không có exception table

--

--

asdasd asdasdasd asdasdasd

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store