По большей части вы правы. Приложения с безопасной системой типов (не только .NET или Java) не позволяют приложению нарушать эти ограничения.
Переполнения буфера и многие другие эксплойты удаленного кода происходят из-за того, что ограничения в этих языках и средах выполнения не обеспечивают проверки и не могут гарантировать, что программа не будет выполнять что-то вроде выполнения произвольного кода в памяти. Безопасные системы проверяют код на отсутствие этих эффектов.
(Как примечание, C # все еще может выполнять небезопасные действия и настраивать себя на выполнение произвольного кода. Это просто довольно громоздко и вряд ли будет использоваться в реальном приложении.)
Бреши в безопасности, которые вы бы увидели в управляемом браузере, были бы, если бы он позволял загружать произвольный код, используя CLR в качестве безопасной среды. Хотя сгенерированный CLR код (т. Е. JIT-файл вашего приложения) будет безопасным, сами загрузчик и верификатор обычно пишутся на более низком языке. Было несколько (я думаю, 2 для .NET?) Брешей в безопасности, где злонамеренно сформированная сборка могла заставить реальный CLR выполнять произвольный код. Однако это относительно редкие проблемы, и площадь поверхности намного меньше, чем была бы в противном случае.
Итак, да, полностью безопасный, управляемый браузер сам по себе не станет жертвой этих специфических эксплойтов. Но это также означает, что ваши плагины должны быть написаны и выполнены аналогичным образом (Flash?). Наконец, существуют другие дыры в безопасности, на которые можно ориентироваться, но обычно они будут менее серьезными, чем вы могли бы найти в неуправляемом приложении. Например, межсайтовый скриптинг все еще остается проблемой. Но по крайней мере у вас не возникнет проблем типа «просмотр документа может выполнить произвольный код».