Google patches second Chrome zero-day in two weeks
zdnet.com
zdnet.com
¹=edit: clarified I was referring to the specific bugs
"There’s a significant overlap between memory vulnerabilities and severe security problems. Of the 34 critical/high bugs, 32 were memory-related."
Rust doesn't fix everything, and this result won't hold for code that is itself security logic (ie, crypto implementation) as logic errors are also very bad. But fixing memory safety does address almost all the high and critical severity issues.
Microsoft published similar research: https://msrc-blog.microsoft.com/2019/07/18/we-need-a-safer-s...
Keep in mind that the Gecko style system has had two decades of work before the Rust code came along, and was written by some excellent programmers. It was extensively fuzzed for years. And still, Rust has enormous potential to solve these security issues.
Only time will tell if the next decade with Rust will pan out as the data seem to predict, but I am quite hopeful.
The bugs you're talking about in JVM, flash, and javascript implementations are bugs that allow malicious code to confuse the language implementation and break out of the programming language defined sandbox. Rust eliminates this class of bugs by not trying to sandbox anything in the first place :P.
If you did try and modify rustc to create that type of sandbox, you would fail, rustc is filled with the sort of bugs that allow malicious code to trick the compiler (largely as a result of using llvm as the backend).
However the bugs that would undermine the security of correctly written code are a different sort of bug. These are bugs where the compiler takes well defined non-exploitable code and miscompiles it to produce a program that when fed malicious input is exploitable. These bugs are much rarer, because the input to the compiler is not malicious so the compiler is much more likely (almost always) to be on the happy/correct path.
"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.
Feel free to start rewriting libpng and freetype in rust. See you in 25 years?
And the common sense at the time did not put too much focus on memory safety.
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.
We are stuck with C due to the synergy effects of having a free beer OS with source code available.
Png is a pretty simple format that everyone already implements. Would you rather use something ad-hoc?
"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
I guess in IT one needs a couple of decades to be proven right.
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.
CVE-2020-16009 is a bug in V8 (Chrome's implementation of JavaScript).
You could write a JavaScript implementation in Rust. However, to achieve acceptable performance, you would almost certainly need to use a lot of "unsafe" code. A performant JavaScript implementation has to be able to generate raw machine code, after all, and then execute it. And the garbage collector probably isn't going to manage memory in a way that the Rust compiler can verify for correctness.
So no, "use a memory-safe language" isn't a simple answer to this kind of bug. Using Rust could reduce the attack surface somewhat but certainly would not completely prevent bugs.
>As Google revealed last week on Friday, this Chrome zero-day was utilized together with a Windows zero-day (CVE-2020-17087).
I thought Chrome only used DirectWrite font rendering on Windows, and only used dynamically linked system FreeType on Linux-like platforms. https://bugs.chromium.org/p/chromium/issues/detail?id=670480 shows that some people were discussing using FreeType on Windows, but it doesn't seem to have resulted in any actions.
I'm not sure what's better, keeping data in tabs but at risk, or involuntarily losing data to protect users.