Chi tiết kỹ thuật về việc tắt các tiện ích bổ sung gần đây trong Firefox

Ghi chú Người dịch: để thuận tiện cho độc giả, ngày tháng được ghi theo giờ Moscow

Gần đây chúng tôi đã bỏ lỡ thời hạn hết hạn của một trong các chứng chỉ được sử dụng để ký các tiện ích bổ sung. Điều này dẫn đến việc các tiện ích bổ sung bị vô hiệu hóa đối với người dùng. Bây giờ sự cố gần như đã được khắc phục, tôi muốn chia sẻ chi tiết về những gì đã xảy ra và công việc đã được thực hiện.

Bối cảnh: bổ sung và chữ ký

Mặc dù nhiều người sử dụng trình duyệt này ngay từ đầu nhưng Firefox vẫn hỗ trợ các tiện ích mở rộng được gọi là “tiện ích bổ sung”. Với sự trợ giúp của họ, người dùng sẽ thêm nhiều tính năng khác nhau vào trình duyệt. Có hơn 15 nghìn tiện ích bổ sung: từ chặn quảng cáo để quản lý hàng trăm tab.

Các tiện ích bổ sung được cài đặt phải có chữ ký số, bảo vệ người dùng khỏi các tiện ích bổ sung độc hại và yêu cầu nhân viên Mozilla xem xét tối thiểu các tiện ích bổ sung. Chúng tôi đã đưa ra yêu cầu này vào năm 2015 vì chúng tôi đang gặp phải vấn đề nghiêm trọng với các tiện ích bổ sung độc hại.

Cách hoạt động: Mỗi bản sao của Firefox đều chứa "chứng chỉ gốc". Chìa khóa của “root” này được lưu trữ trong Mô-đun bảo mật phần cứng (HSM)không có quyền truy cập mạng. Cứ sau vài năm, một “chứng chỉ trung gian” mới sẽ được ký bằng khóa này, khóa này được sử dụng khi ký các tiện ích bổ sung. Khi nhà phát triển gửi tiện ích bổ sung, chúng tôi sẽ tạo "chứng chỉ cuối" tạm thời và ký nó bằng chứng chỉ trung gian. Bản thân tiện ích bổ sung sau đó được ký với chứng chỉ cuối cùng. Sơ đồ nó trông như thế này.

Xin lưu ý rằng mỗi chứng chỉ đều có "chủ thể" (người cấp chứng chỉ) và "tổ chức phát hành" (người cấp chứng chỉ). Trong trường hợp chứng chỉ gốc, "chủ đề" = "nhà phát hành", nhưng đối với các chứng chỉ khác, tổ chức phát hành chứng chỉ là đối tượng của chứng chỉ gốc mà chứng chỉ đó được ký.

Một điểm quan trọng: mỗi tiện ích bổ sung được ký bởi một chứng chỉ cuối duy nhất, nhưng hầu như các chứng chỉ cuối này luôn được ký bởi cùng một chứng chỉ trung gian.

Ghi chú của tác giả: Ngoại lệ là những bổ sung rất cũ. Vào thời điểm đó, nhiều chứng chỉ trung gian khác nhau đã được sử dụng.

Chứng chỉ trung gian này gây ra vấn đề: mỗi chứng chỉ có giá trị trong một khoảng thời gian nhất định. Trước hoặc sau khoảng thời gian này, chứng chỉ không hợp lệ và trình duyệt sẽ không sử dụng các tiện ích bổ sung được ký bởi chứng chỉ này. Thật không may, chứng chỉ trung cấp đã hết hạn vào lúc 4 giờ sáng ngày 4 tháng XNUMX.

Hậu quả đã không xuất hiện ngay lập tức. Firefox không kiểm tra chữ ký của các tiện ích bổ sung đã cài đặt liên tục mà khoảng 24 giờ một lần và thời gian xác minh là riêng cho mỗi người dùng. Kết quả là, một số người gặp vấn đề ngay lập tức, trong khi những người khác lại gặp vấn đề muộn hơn. Lần đầu tiên chúng tôi nhận ra vấn đề vào khoảng thời gian chứng chỉ hết hạn và ngay lập tức bắt đầu tìm kiếm giải pháp.

Giảm thiệt hại

Khi chúng tôi nhận ra điều gì đã xảy ra, chúng tôi cố gắng ngăn chặn tình hình trở nên tồi tệ hơn.

Đầu tiên, họ ngừng chấp nhận và ký bổ sung mới. Không có ích gì khi sử dụng chứng chỉ đã hết hạn cho việc này. Nhìn lại, tôi có thể nói rằng lẽ ra chúng ta có thể để mọi thứ như cũ. Bây giờ chúng tôi đã tiếp tục chấp nhận bổ sung.

Thứ hai, họ ngay lập tức đưa ra bản sửa lỗi ngăn việc kiểm tra chữ ký hàng ngày. Vì vậy, chúng tôi đã cứu những người dùng mà trình duyệt chưa có thời gian kiểm tra các tiện ích bổ sung trong XNUMX giờ qua. Bản sửa lỗi này hiện đã bị thu hồi và không còn cần thiết nữa.

Hoạt động song song

Về lý thuyết, giải pháp cho vấn đề có vẻ đơn giản: tạo chứng chỉ trung gian hợp lệ mới và ký lại từng tiện ích bổ sung. Thật không may điều này sẽ không hoạt động:

  • chúng tôi không thể nhanh chóng ký lại 15 nghìn tiện ích bổ sung cùng một lúc, hệ thống không được thiết kế cho tải như vậy
  • Sau khi chúng tôi ký bổ sung, các phiên bản cập nhật cần được gửi đến người dùng. Hầu hết các tiện ích bổ sung được cài đặt từ máy chủ Mozilla, vì vậy Firefox sẽ tìm thấy các bản cập nhật trong vòng XNUMX giờ tới, nhưng một số nhà phát triển phân phối các tiện ích bổ sung đã được ký thông qua các kênh của bên thứ ba, vì vậy người dùng sẽ phải cập nhật các tiện ích bổ sung đó theo cách thủ công.

Thay vào đó, chúng tôi đã cố gắng phát triển một bản sửa lỗi có thể tiếp cận tất cả người dùng mà không yêu cầu họ phải thực hiện nhiều hoặc không cần thực hiện hành động nào.

Rất nhanh chóng, chúng tôi đã đạt được hai chiến lược chính mà chúng tôi đã sử dụng song song:

  • Cập nhật Firefox để thay đổi thời hạn hiệu lực của chứng chỉ. Điều này sẽ làm cho các tiện ích bổ sung hiện có hoạt động trở lại một cách thần kỳ nhưng sẽ yêu cầu phát hành và vận chuyển bản dựng Firefox mới.
  • Tạo chứng chỉ hợp lệ và bằng cách nào đó thuyết phục Firefox chấp nhận nó thay vì chứng chỉ hiện có đã hết hạn

Trước tiên, chúng tôi quyết định sử dụng tùy chọn đầu tiên, có vẻ khá khả thi. Vào cuối ngày, họ đã phát hành bản sửa lỗi thứ hai (chứng chỉ mới) mà chúng ta sẽ nói đến sau.

Thay thế chứng chỉ

Như tôi đã đề cập ở trên, nó được yêu cầu:

  • tạo chứng chỉ hợp lệ mới
  • cài đặt nó từ xa trong Firefox

Để hiểu lý do tại sao điều này lại hiệu quả, chúng ta hãy xem xét kỹ hơn quy trình xác minh tiện ích bổ sung. Bản thân tiện ích bổ sung này có dạng một tập hợp các tệp, bao gồm một chuỗi chứng chỉ được sử dụng để ký. Do đó, tiện ích bổ sung có thể được xác minh nếu trình duyệt biết chứng chỉ gốc được tích hợp vào Firefox tại thời điểm xây dựng. Tuy nhiên, như chúng ta đã biết, chứng chỉ trung gian đã hết hạn nên không thể xác minh tiện ích bổ sung.

Khi Firefox cố gắng xác minh một tiện ích bổ sung, nó không bị giới hạn trong việc sử dụng các chứng chỉ có trong chính tiện ích bổ sung đó. Thay vào đó, trình duyệt cố gắng tạo chuỗi chứng chỉ hợp lệ, bắt đầu bằng chứng chỉ cuối và tiếp tục cho đến khi đến thư mục gốc. Ở cấp độ đầu tiên, chúng tôi bắt đầu với chứng chỉ cuối cùng và sau đó tìm chứng chỉ có chủ đề là nhà phát hành chứng chỉ cuối (tức là chứng chỉ trung gian). Thông thường, chứng chỉ trung gian này được cung cấp cùng với tiện ích bổ sung nhưng bất kỳ chứng chỉ nào từ bộ lưu trữ của trình duyệt cũng có thể đóng vai trò là chứng chỉ trung gian này. Nếu chúng tôi có thể thêm chứng chỉ hợp lệ mới vào kho chứng chỉ từ xa, Firefox sẽ cố gắng sử dụng nó. Tình hình trước và sau khi cài đặt chứng chỉ mới.

Sau khi cài đặt chứng chỉ mới, Firefox sẽ có hai tùy chọn khi xác thực chuỗi chứng chỉ: sử dụng chứng chỉ không hợp lệ cũ (sẽ không hoạt động) hoặc chứng chỉ hợp lệ mới (sẽ hoạt động). Điều quan trọng là chứng chỉ mới phải có cùng tên chủ đề và khóa chung như chứng chỉ cũ nên chữ ký của nó trên chứng chỉ cuối cùng sẽ hợp lệ. Firefox đủ thông minh để thử cả hai tùy chọn cho đến khi tìm thấy một tùy chọn hoạt động, vì vậy các tiện ích bổ sung sẽ được thử nghiệm lại. Lưu ý rằng đây chính là logic mà chúng tôi sử dụng để xác thực chứng chỉ TLS.

Lưu ý của tác giả: Người đọc quen thuộc với WebPKI sẽ lưu ý rằng chứng chỉ chéo hoạt động theo cách giống hệt nhau.

Điều tuyệt vời ở bản sửa lỗi này là nó không yêu cầu bạn phải ký lại các tiện ích bổ sung hiện có. Ngay sau khi trình duyệt nhận được chứng chỉ mới, tất cả các tiện ích bổ sung sẽ hoạt động trở lại. Thử thách còn lại là cung cấp chứng chỉ mới cho người dùng (tự động và từ xa), cũng như yêu cầu Firefox kiểm tra lại các tiện ích bổ sung bị vô hiệu hóa.

Normandy và hệ thống nghiên cứu

Trớ trêu thay, vấn đề này lại được giải quyết bằng một tiện ích bổ sung đặc biệt có tên là “hệ thống”. Để tiến hành nghiên cứu, chúng tôi đã phát triển một hệ thống có tên Normandy nhằm cung cấp nghiên cứu cho người dùng. Những nghiên cứu này được thực hiện tự động trong trình duyệt và có quyền truy cập nâng cao vào API nội bộ của Firefox. Nghiên cứu có thể thêm chứng chỉ mới vào kho chứng chỉ.

Lưu ý của tác giả: Chúng tôi không thêm chứng chỉ với bất kỳ đặc quyền nào; nó được ký bởi chứng chỉ gốc, vì vậy Firefox tin tưởng nó. Chúng tôi chỉ cần thêm nó vào nhóm chứng chỉ mà trình duyệt có thể sử dụng.

Vì vậy, giải pháp là tạo ra một nghiên cứu:

  • cài đặt chứng chỉ mới mà chúng tôi đã tạo cho người dùng
  • buộc trình duyệt kiểm tra lại các tiện ích bổ sung bị vô hiệu hóa để chúng hoạt động trở lại

“Nhưng chờ đã,” bạn nói, “tiện ích bổ sung không hoạt động, làm cách nào tôi có thể khởi chạy tiện ích bổ sung hệ thống?” Hãy ký nó với một giấy chứng nhận mới!

Đặt tất cả lại với nhau... tại sao lại mất nhiều thời gian như vậy?

Vì vậy, kế hoạch: cấp chứng chỉ mới để thay thế chứng chỉ cũ, tạo tiện ích bổ sung hệ thống và cài đặt nó cho người dùng thông qua Normandy. Vấn đề, như tôi đã nói, bắt đầu vào lúc 4 giờ ngày 4 tháng 00, và đến 12 giờ 44 phút cùng ngày, chưa đầy 9 giờ sau, chúng tôi đã gửi bản sửa lỗi tới Normandy. Phải mất thêm 6-12 giờ nữa nó mới đến được với tất cả người dùng. Không tệ chút nào, nhưng mọi người trên Twitter đang hỏi tại sao chúng tôi không thể hành động nhanh hơn.

Đầu tiên, phải mất thời gian để cấp chứng chỉ trung cấp mới. Như tôi đã đề cập ở trên, khóa chứng chỉ gốc được lưu trữ ngoại tuyến trong mô-đun bảo mật phần cứng. Điều này tốt từ quan điểm bảo mật, vì root rất hiếm khi được sử dụng và cần được bảo vệ một cách đáng tin cậy, nhưng sẽ hơi bất tiện khi bạn cần khẩn trương ký một chứng chỉ mới. Một trong những kỹ sư của chúng tôi đã phải đến cơ sở lưu trữ HSM. Sau đó, có những nỗ lực không thành công để cấp chứng chỉ chính xác và mỗi lần thử đều tiêu tốn một hoặc hai giờ để kiểm tra.

Thứ hai, việc phát triển tiện ích bổ sung hệ thống mất một thời gian. Về mặt khái niệm thì nó rất đơn giản, nhưng ngay cả những chương trình đơn giản cũng cần được chăm sóc. Chúng tôi muốn đảm bảo rằng chúng tôi không làm tình hình trở nên tồi tệ hơn. Nghiên cứu cần phải được thử nghiệm trước khi gửi đến người dùng. Ngoài ra, tiện ích bổ sung phải được ký nhưng hệ thống ký tiện ích bổ sung của chúng tôi đã bị vô hiệu hóa nên chúng tôi phải tìm cách giải quyết.

Cuối cùng, khi chúng tôi đã chuẩn bị xong nghiên cứu để nộp, việc triển khai sẽ mất thời gian. Trình duyệt kiểm tra các bản cập nhật Normandy cứ sau 6 giờ. Không phải máy tính nào cũng luôn bật và kết nối Internet nên sẽ mất thời gian để bản sửa lỗi lan rộng đến người dùng.

bước cuối cùng

Nghiên cứu sẽ khắc phục được sự cố cho hầu hết người dùng nhưng không phải ai cũng có thể thực hiện được. Một số người dùng yêu cầu một cách tiếp cận đặc biệt:

  • người dùng đã vô hiệu hóa nghiên cứu hoặc đo từ xa
  • người dùng phiên bản Android (Fennec), nơi nghiên cứu hoàn toàn không được hỗ trợ
  • người dùng các bản dựng Firefox ESR tùy chỉnh trong các doanh nghiệp không thể bật tính năng đo từ xa
  • người dùng ngồi sau proxy MitM, vì hệ thống cài đặt tiện ích bổ sung của chúng tôi sử dụng tính năng ghim khóa, tính năng này không hoạt động với các proxy như vậy
  • người dùng các phiên bản Firefox cũ không hỗ trợ nghiên cứu

Chúng tôi không thể làm bất cứ điều gì đối với nhóm người dùng sau - họ vẫn nên cập nhật lên phiên bản Firefox mới, vì những phiên bản lỗi thời có những lỗ hổng nghiêm trọng chưa được vá. Chúng tôi biết rằng một số người vẫn sử dụng các phiên bản Firefox cũ hơn vì họ muốn chạy các tiện ích bổ sung cũ nhưng nhiều tiện ích bổ sung cũ đã được chuyển sang các phiên bản mới hơn của trình duyệt. Đối với những người dùng khác, chúng tôi đã phát triển một bản vá sẽ cài đặt chứng chỉ mới. Nó được phát hành dưới dạng bản phát hành sửa lỗi (ghi chú của người dịch: Firefox 66.0.5), nên mọi người sẽ nhận được nó - rất có thể đã nhận được nó - thông qua kênh cập nhật thường xuyên. Nếu bạn đang sử dụng bản dựng tùy chỉnh của Firefox ESR, vui lòng liên hệ với nhà bảo trì của bạn.

Chúng tôi hiểu rằng điều này không lý tưởng. Trong một số trường hợp, người dùng bị mất dữ liệu tiện ích bổ sung (ví dụ: dữ liệu tiện ích bổ sung Vùng chứa nhiều tài khoản).

Tác dụng phụ này là không thể tránh khỏi nhưng chúng tôi tin rằng trước mắt chúng tôi đã chọn được giải pháp tốt nhất cho hầu hết người dùng. Về lâu dài, chúng tôi sẽ tìm kiếm các phương pháp kiến ​​trúc khác tiên tiến hơn.

Những bài học

Đầu tiên, nhóm của chúng tôi đã thực hiện một công việc tuyệt vời khi tạo và gửi bản sửa lỗi trong vòng chưa đầy 12 giờ sau khi sự cố được phát hiện. Là một người đã tham dự các cuộc họp, tôi có thể nói rằng trong hoàn cảnh khó khăn này, mọi người đã làm việc rất chăm chỉ và rất ít thời gian bị lãng phí.

Rõ ràng, những điều này lẽ ra không nên xảy ra. Rõ ràng việc điều chỉnh các quy trình của chúng tôi để giảm khả năng xảy ra những sự cố như vậy là điều đáng làm và giúp việc khắc phục trở nên dễ dàng hơn.

Tuần tới chúng tôi sẽ công bố kết quả khám nghiệm tử thi chính thức và danh sách những thay đổi mà chúng tôi dự định thực hiện. Bây giờ, tôi sẽ chia sẻ suy nghĩ của mình. Đầu tiên, phải có một cách tốt hơn để theo dõi tình trạng của một quả bom hẹn giờ tiềm năng. Chúng ta cần chắc chắn rằng chúng ta không rơi vào tình huống mà một trong số chúng đột nhiên hoạt động. Chúng tôi vẫn đang nghiên cứu chi tiết, nhưng ở mức tối thiểu, cần phải tính đến tất cả những điều đó.

Thứ hai, chúng ta cần một cơ chế để nhanh chóng cung cấp các bản cập nhật cho người dùng, ngay cả khi—đặc biệt là khi—mọi thứ khác đều không thành công. Thật tuyệt khi chúng tôi có thể sử dụng hệ thống "nghiên cứu", nhưng nó là một công cụ không hoàn hảo và có một số tác dụng phụ không mong muốn. Đặc biệt, chúng tôi biết rằng nhiều người dùng đã bật cập nhật tự động nhưng không muốn tham gia nghiên cứu (tôi thừa nhận, tôi cũng đã tắt chúng!). Đồng thời, chúng tôi cần một cách để gửi bản cập nhật cho người dùng, nhưng bất kể việc triển khai kỹ thuật nội bộ là gì, người dùng vẫn có thể đăng ký nhận các bản cập nhật (bao gồm cả các bản sửa lỗi nóng) nhưng chọn không tham gia mọi thứ khác. Ngoài ra, kênh cập nhật sẽ phản hồi nhanh hơn hiện tại. Ngay cả vào ngày 6 tháng XNUMX, vẫn có những người dùng không tận dụng được bản sửa lỗi hoặc phiên bản mới. Vấn đề này đã được giải quyết rồi, nhưng những gì đã xảy ra cho thấy nó quan trọng như thế nào.

Cuối cùng, chúng ta sẽ xem xét kỹ hơn kiến ​​trúc bảo mật của tiện ích bổ sung để đảm bảo nó cung cấp mức bảo mật phù hợp với rủi ro phá vỡ mọi thứ ở mức tối thiểu.

Tuần tới chúng ta sẽ xem xét kết quả phân tích kỹ lưỡng hơn về những gì đã xảy ra, nhưng trong thời gian chờ đợi, tôi rất sẵn lòng trả lời các câu hỏi qua email: [email được bảo vệ]

Nguồn: linux.org.ru

Thêm một lời nhận xét