5 ms·
CVE-2020-15999 was described as: "A vulnerability exists in the function `Load_SBit_Png`, which processes PNG images embedded into fonts. This function: 1) Ob
by muizelaar 6y ago
CVE-2020-15999 was described as:
"A vulnerability exists in the function `Load_SBit_Png`, which processes PNG
images embedded into fonts. This function:
1) Obtains the image width and height from the header as 32-bit integers.
2) Truncates the obtained values to 16 bit and stores them in a
`TT_SBit_Metrics` structure.
3) Uses the truncated values to calculate the bitmap size.
4) Allocates the backing store of that size.
5) Passes `png_struct` and the backing store to a libpng function.
The issue is that libpng uses the original 32-bit values, which are saved in
`png_struct`. Therefore, if the original width and/or height are greater than
65535, the allocated buffer won't be able to fit the bitmap."
This one could only happen in an memory unsafe programming language. Having bounds
checks on the destination buffer would have avoided the problem.
- im3w1l 6y agoThe issue is in the bindings, which necessarily call libpng in an unsafe way. But if you use known-good bindings it should be prevented. Or if you use a native memory safe library for that matter.
- jeffbee 6y agoFreeType is an endless shitshow of security vulnerabilities going back 25 years now. There's really no excuse in 2020 for writing libraries to decode file formats in unsafe languages. Yes, there are performance-sensitive aspects to image decoding, but opening the file and reading two integers is not one of those.
- projct 6y agoI would bet that most libraries chrome uses for file format parsing would not lose any performance at all if rewritten in rust.
- josefx 6y agoYou don't even have to drop the remaining zero-days if you apply enough performance hacks using unsafe.
- albntomat0 6y agoI believe your comment under appreciated the utility of having all unsafe functionality clearly marked as such, with the additional scrutiny that such a label would bring. Instead of having to look through the entire codebase for memory issues, only small set of areas would need to be validated.
- saagarjha 6y agoThe problem is you’d have to rewrite them.
- bsdubernerd 6y agoAs if this was available 25 years ago. IMHO the real issue is embedded pngs in _fonts_, but YMMV. Feel free to start rewriting libpng and freetype in rust. See you in 25 years?
- jeffbee 6y agoIt's incorrect to believe that C was the right choice even in 1996. At that time it was already obviously the wrong choice.
- extropy 6y agoIt was the only choice that met the performance constraints at the time. And the common sense at the time did not put too much focus on memory safety.
- pjmlp 6y agoI was meeting the performance constraints of doing software in MS-DOS with Turbo Pascal.
- stonogo 6y agoI wasn't; back then there were a LOT of things, especially in graphics and linear algebra, that required dropping to embedded ASM to accomplish in a performant way. I think Turbo- and Object Pascal were great languages, but let's not pretend they were anywhere near the speed of C.
- jeffbee 6y agoThe point of my remark here is we aren't talking about rendering text along a path or whatever. We're talking about opening a file and parsing a binary format, which is in most use cases not at all performance-sensitive.
- pjmlp 6y agoC machine code quality was just as slow as anything else on 16 bit computers, lets not pretend otherwise. Modula-2 and Pascal compilers had the necessary switches to make the languages just as unsafe as C, and anything related to ultimate performance out of 8086 and 68000 required Assembly anyway.
- bartvk 6y agoWhy do you call it like that? I mean, does it compare bad enough to other font libraries that you feel justified in summarizing it as "an endless shitshow"?
- fulafel 6y agoIt was not originally meant to be fed malicious inputs from the web all day though. I think the majority of the responsibility rests on people plugging it into web browsers.
- jeffbee 6y agoI don't think that's really true. Downloading and installing fonts was one of the very first popular activities online. At the time FreeType was written it was easily seen that untrusted inputs would be the norm.
- fulafel 6y agoSure but you can hardly place the same onus of security rigor on the shoulders of a 90's OS/2 software hobbyist enabling people to explicitly download font files once in a blue moon from sources they explicitly choose, vs a big corporation in the 00's employing world class product security staff deciding to stick that in their source tree without even a shrug, where the downloading and applying the fonts happens behind the users back with 0 interaction.
- jeffbee 6y agoI believe WebKit integrated FreeType2 years before Chrome project even started.
- pjmlp 6y agoAs Hoare would put it in 1981, "The first principle was security: The principle that every syntactically incorrect program should be rejected by the compiler and that every syntactically correct program should give a result or an error message that was predictable and comprehensible in terms of the source language program itself. Thus no core dumps should ever be necessary. It was logically impossible for any source language program to cause the computer to run wild, either at compile time or at run time. A consequence of this principle is that every occurrence of every subscript of every subscripted variable was on every occasion checked at run time against both the upper and the lower declared bounds of the array. Many years later we asked our customers whether they wished us to provide an option to switch off these checks in the interests of efficiency on production runs. Unanimously, they urged us not to--they already knew how frequently subscript errors occur on production runs where failure to detect them could be disastrous. I note with fear and horror that even in 1980, language designers and users have not learned this lesson. In any respectable branch of engineering, failure to observe such elementary pre- cautions would have long been against the law." https://www.cs.fsu.edu/~engelen/courses/COP4610/hoare.pdf https://www.cs.fsu.edu/~engelen/courses/COP4610/hoare.pdf I guess in IT one needs a couple of decades to be proven right.
- MauranKilom 6y ago> Having bounds checks on the destination buffer would have avoided the problem. Since the access to the buffer happens inside libpng, this means libpng should have bounds checks compiled in according to your argument. (Hoping that the compiler can elide them by seeing through the library interface is but wishful thinking.) Would you rather have a slower version of libpng that defends against screwups of the calling code, or a faster version that assumes the calling code is sane? Not an obvious choice to me.
- pjmlp 6y agoWould you rather have a belt that limits movements that defends against crashes, or freedom of movements that assumes a car crash never happens? Not an obvious choice to me.