Ten years in the wrong regex lane

Today I want to share the story of a couple of regular expressions — a tiny inaccuracy in them ended up costing the world more than 50 million hours of CPU time on iOS devices.

Disclaimer: this post is packed with technical details and might be a tough read if you don’t know how to code.

How content blockers work in Safari

First, let me explain how ad blockers in Safari actually work. The fact is, AdGuard on iOS relies on Safari’s built-in mechanism called Safari Content Blockers.

These days, there’s also support for an alternative approach — declarativeNetRequest (DNR), partially compatible with Chrome and Firefox. Interestingly enough, in Safari’s case, DNR rules are silently translated into Safari Content Blocker rules under the hood.

The very first version of AdGuard for iOS was released in October 2015, and right away we ran into a nasty problem. Historically, ad blockers have always used their own filtering rule syntax. It’s powerful and specifically designed for web filtering. Apple, however, introduced their own take on it, which was quite different from what the community was used to.

To jump ahead a little: when Chrome introduced declarativeNetRequest, they also went their own way. At least when it came to URL matching, their syntax was much closer to what we were familiar with.

Here’s an example of how a standard AdGuard rule gets converted into syntax supported by Safari:

Converting an AdGuard rule into a Safari-accepted rule

Notice what happens to the URL pattern. In AdGuard filters, we use a special wildcard-like syntax tailored specifically to URLs. The reason is simple: traditional regular expressions are too slow for this job.

Regular expressions

Safari Content Blockers, on the other hand, rely on regular expressions — although in a very stripped-down form, so that they can still be compiled into a structure that speeds up matching.

If you’re curious about the internals: Safari builds a DFA bytecode out of regex patterns, which is then executed by a custom interpreter: DFABytecodeInterpreter.cpp.

Regexps are more versatile than the standard ad blocker syntax. Unfortunately, that flexibility isn’t really relevant for web content filtering. What we get instead is very slow rule compilation that eats up resources, plus strict limits on how many rules filters can contain. We’ve written before about Safari’s issues, and most of them are still around.

Pattern conversion v1.0

So, back in 2015, we had to figure out how to convert AdGuard’s URL patterns into regexps that Safari would accept.

We faced two major tasks at the time.

First, we needed to cut down the total number of rules in the final set. Back then, Safari had a hard limit of 50,000 rules. (We described how we tackled this in our post about ad blocking in Safari).

By the way, the current limit has been raised to 150,000. However, due to process memory limits, you can only use around 60–80K in practice. We reported this to Apple a couple of times (Apple Feedback Assistant reports: FB19728743, FB13282146), but to no avail.

The second task was to ensure the regexps we generated were efficient enough to run fast and lightweight enough for iOS to compile them. In those days, we sometimes saw the system kill the com.apple.Safari.ContentBlockerLoader process because it consumed too many resources.

After a lot of manual testing, we settled on what seemed like the optimal conversion rules:

  • The symbol || (“start of URL”) became ^[htpsw]+://([a-z0-9-]\.)?
  • The symbol ^ (“separator”) became [/:&?]

We felt confident we’d done our homework, so we stopped worrying about it and left things as they were — for nearly ten years.

We were wrong

It all started with another bug report. The issue was that our standard conversion method slightly changed the semantics of the special || symbol. On iOS, it ended up matching only a single subdomain level, while in every other version of AdGuard it matched across all levels.

The simple fix was to use the regular expression originally suggested by the WebKit developers back in 2015 — the one we had dismissed as “non-optimal” at the time. But we were so sure of our choice back then that we didn’t even bother to recheck until recently.

The changes we should have made were dead simple:

  • Replace || with ^[^:]+://+([^:/]+\.)?
  • Replace ^ in most cases with [/:]

But was there really that much of a difference? Turns out — oh yes, there was.

Oh boy, how wrong we were

After swapping in the new regexps, we ran a couple of quick tests and the results blew us away. Rule loading speed in Safari didn’t just improve a little — it skyrocketed.

To put it in numbers: compiling the Tracking Protection filter in Safari became 5.5 times faster, and compiling the Base filter became 2.8 times faster.

And to make it more tangible, just take a look at the video below:

When you add up the number of AdGuard users over the past decade, and how many times the app had to recompile filters, the wasted CPU time comes out to at least 50 million extra hours on iOS devices.

I honestly feel ashamed about this mistake — especially knowing that the correct solution was staring us in the face the whole time. In hindsight, it’s clear that these new regexps were obviously going to compile and run faster than what we had chosen.

So what exactly was our mistake back then? I think it all comes down to a flawed testing methodology. We tried to judge “by eye,” instead of:

  1. Defining a clear set of criteria: memory usage, speed, and actual content blocker performance in the browser.
  2. Most importantly: learning how to measure those things precisely. Not by eyeballing Activity Monitor or top, but by using a proper profiler.

The good news is, this problem is now fixed. And I really hope we’ve learned the lessons we needed to, so we won’t repeat mistakes like this in the future.

Thích bài viết này?
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
Màn hình chính của AdGuard cho Windows
Màn hình sự bảo vệ của AdGuard cho Windows, hiển thị các tính năng và cài đặt sự bảo vệ
Màn hình Thống kê của AdGuard cho Windows, hiển thị thống kê về quảng cáo và trình theo dõi Đã bị chặn
Màn hình Quản lý ứng dụng của AdGuard cho Windows, hiển thị các tùy chọn quản lý sự bảo vệ cho các ứng dụng được cài đặt trên thiết bị
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard: trình chặn quảng cáo cho Windows

AdGuard cho Windows không chỉ là một trình chặn quảng cáo. Đây là công cụ đa năng giúp chặn quảng cáo, kiểm soát truy cập vào các trang web nguy hiểm, tăng tốc độ tải trang và bảo vệ trẻ em khỏi nội dung không phù hợp
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Cửa hàng ứng dụng Microsoft
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
AdGuard cho Windows v8.0, thời gian dùng thử 14 ngày
Màn hình chính của AdGuard cho Mac
Màn hình Chế độ ẩn của AdGuard cho Mac
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard: trình chặn quảng cáo cho Mac

AdGuard cho Mac là một trình chặn quảng cáo độc đáo được thiết kế dành riêng cho macOS. Ngoài việc bảo vệ bạn khỏi các quảng cáo gây phiền nhiễu trong trình duyệt và ứng dụng, nó còn bảo vệ bạn khỏi theo dõi, lừa đảo và gian lận
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
AdGuard cho Mac v2.19, thời gian dùng thử 14 ngày
Màn hình chính của AdGuard cho Android
Màn hình Bảo vệ theo dõi của AdGuard cho Android
Màn hình Quản lý ứng dụng của AdGuard cho Android, hiển thị các tùy chọn quản lý sự bảo vệ cho các ứng dụng được cài đặt trên thiết bị
Màn hình Thống kê của AdGuard cho Android, hiển thị thống kê về quảng cáo và trình theo dõi Đã bị chặn
Màn hình chính của trình duyệt riêng tư của AdGuard cho Android
Mã QR để tải xuống AdGuard cho Android
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard: trình chặn quảng cáo cho Android

Chặn quảng cáo và trình theo dõi trên mọi trình duyệt, trò chơi và các ứng dụng khác. Bảo vệ quyền riêng tư của bạn và cho phép bạn kiểm soát cách các ứng dụng sử dụng Internet. Cài đặt qua APK
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
Quét để tải xuống
Sử dụng bất kỳ trình đọc mã QR nào có sẵn trên thiết bị của bạn.
AdGuard cho Android v4.14, thời gian dùng thử 14 ngày
Màn hình chính của AdGuard cho iOS
Màn hình sự bảo vệ của AdGuard cho iOS, hiển thị các tính năng và cài đặt sự bảo vệ
Màn hình Thống kê của AdGuard cho iOS, hiển thị thống kê về quảng cáo và trình theo dõi Đã bị chặn
Mã QR để tải xuống AdGuard cho iOS
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard: trình chặn quảng cáo cho iOS

Trình chặn quảng cáo iOS tốt nhất cho iPhone và iPad. AdGuard loại bỏ mọi loại quảng cáo và trình theo dõi trong Safari và bảo vệ quyền riêng tư của bạn trên tất cả các ứng dụng ở cấp độ DNS
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
Quét để tải xuống
Sử dụng bất kỳ trình đọc mã QR nào có sẵn trên thiết bị của bạn.
AdGuard cho iOS phiên bản 4.5
Màn hình chính của AdGuard Content Blocker
Màn hình Bộ lọc của AdGuard Content Blocker
Màn hình cài đặt của AdGuard Content Blocker
20.686 20686 đánh giá của người dùng
Tuyệt vời!

Trình Chặn Nội Dung AdGuard

AdGuard Content Blocker loại bỏ tất cả các loại quảng cáo trên các trình duyệt di động hỗ trợ công nghệ chặn nội dung — cụ thể là Samsung Internet và Yandex Browser. Tính năng của nó bị hạn chế so với AdGuard cho Android, nhưng miễn phí, dễ cài đặt và hiệu quả
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
Trình Chặn Nội Dung AdGuard phiên bản 2.8
Màn hình chính của AdGuard Browser Extension
Màn hình Bảo vệ theo dõi của AdGuard Browser Extension
20.686 20686 đánh giá của người dùng
Tuyệt vời!

Tiện ích mở rộng Trình duyệt AdGuard

AdGuard là tiện ích mở rộng chặn quảng cáo nhanh nhất và nhẹ nhất chặn hiệu quả tất cả các loại quảng cáo trên tất cả các trang web! Chọn AdGuard cho trình duyệt bạn sử dụng và nhận duyệt web không có quảng cáo, nhanh chóng và an toàn.
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
Tiện ích mở rộng Trình duyệt AdGuard phiên bản 5.5
Màn hình chính của AdGuard Assistant
20.686 20686 đánh giá của người dùng
Tuyệt vời!

Trợ lý AdGuard

Một tiện ích mở rộng trình duyệt đồng hành cho ứng dụng AdGuard trên máy tính. Nó cho phép bạn chặn các mục tùy chỉnh trên websites, thêm websites vào danh sách cho phép và gửi báo cáo trực tiếp từ trình duyệt của bạn
Trợ lý AdGuard phiên bản 1.4
20.686 20686 đánh giá của người dùng
Tuyệt vời!

Trang chủ AdGuard

AdGuard Home là một giải pháp dựa trên mạng để chặn quảng cáo và trình theo dõi. Cài đặt nó một lần trên bộ định tuyến của bạn để bao phủ tất cả các thiết bị trên mạng gia đình của bạn — không cần phần mềm máy khách bổ sung. Điều này đặc biệt quan trọng đối với các thiết bị IoT khác nhau thường gây ra mối đe dọa đối với quyền riêng tư của bạn
Trang chủ AdGuard phiên bản 0.107
Màn hình chính của AdGuard Pro cho iOS
Màn hình Bảo vệ của AdGuard Pro cho iOS, hiển thị các tính năng và cài đặt sự bảo vệ
Màn hình Thống kê của AdGuard Pro cho iOS, hiển thị số liệu về quảng cáo và trình theo dõi đã bị chặn
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard Pro cho iOS

AdGuard Pro cho iOS được trang bị tất cả các tính năng bảo vệ chặn quảng cáo nâng cao. Nó cung cấp các công cụ tương tự như phiên bản trả phí của AdGuard cho iOS. Nó nổi trội trong việc chặn quảng cáo trên Safari và cho phép bạn tùy chỉnh cài đặt DNS để bảo vệ tối ưu. Nó chặn quảng cáo trong trình duyệt và ứng dụng, bảo vệ con bạn khỏi nội dung không phù hợp và giữ an toàn cho dữ liệu cá nhân của bạn.
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
AdGuard Pro cho iOS phiên bản 4.5
Màn hình chính của AdGuard Mini cho Mac
Màn hình sự bảo vệ Safari của AdGuard Mini cho Mac
Màn hình tạo quy tắc của AdGuard Mini cho Mac
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard Mini cho Mac — trình chặn quảng cáo Safari

AdGuard Mini cho Mac là một trình chặn quảng cáo Safari mạnh mẽ. Ứng dụng nhẹ này loại bỏ quảng cáo, chặn các trình theo dõi, và tăng tốc tải trang. Nó giúp bạn trình duyệt trang web trong Safari mà không bị làm phiền và giữ dữ liệu của bạn được riêng tư
Cài đặt
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
AdGuard Mini cho Mac phiên bản 2.3
Màn hình chính của AdGuard cho Android TV với sự bảo vệ được bật
Màn hình chặn quảng cáo của AdGuard cho Android TV, hiển thị các tính năng và cài đặt của nó
Màn hình cài đặt của AdGuard cho Android TV
Màn hình Quản lý ứng dụng của AdGuard cho Android TV, hiển thị các ứng dụng nơi quảng cáo và trình theo dõi Đã bị chặn
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard cho Android TV

AdGuard cho Android TV là ứng dụng duy nhất chặn quảng cáo, bảo vệ quyền riêng tư của bạn và hoạt động như một tường lửa cho Smart TV của bạn. Nhận cảnh báo về các mối đe dọa trên web, sử dụng DNS an toàn và hưởng lợi từ lưu lượng truy cập được mã hóa. Thư giãn và đi sâu vào các chương trình yêu thích của bạn với bảo mật hàng đầu và không có quảng cáo!
AdGuard cho Android TV v4.14, thời gian dùng thử 14 ngày
Linh vật AdGuard, Agnar, đang cầm chú chim cánh cụt Linux
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard cho Linux

AdGuard cho Linux là trình chặn quảng cáo Linux trên toàn hệ thống đầu tiên trên thế giới. Chặn quảng cáo và trình theo dõi ở cấp độ thiết bị, chọn từ các bộ lọc được cài đặt sẵn hoặc thêm bộ lọc của riêng bạn — tất cả thông qua giao diện dòng lệnh
AdGuard cho Linux phiên bản 1.4
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard Temp Mail

Trình tạo địa chỉ email tạm thời miễn phí giúp bạn ẩn danh và bảo vệ quyền riêng tư của bạn. Không có thư rác trong hộp thư đến chính của bạn!
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard VPN

75 Vị Trí Trên Thế Giới

Truy cập mọi thông tin

Mã hoá mạnh

Không nhật ký

Đường truyền nhanh nhất

Hỗ trợ 24/7

Dùng thử miễn phí
Bằng cách tải xuống chương trình, bạn chấp nhận các điều khoản của Thỏa thuận cấp phép
Đọc thêm
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard DNS

AdGuard DNS là một cách tuyệt vời để chặn quảng cáo Internet không yêu cầu cài đặt bất kỳ ứng dụng nào. Nó rất dễ sử dụng, hoàn toàn miễn phí, dễ dàng thiết lập trên bất kỳ thiết bị nào và cung cấp cho bạn các chức năng cần thiết tối thiểu để chặn quảng cáo, quầy, trang web độc hại và nội dung người lớn.
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard Mail

Bảo vệ danh tính của bạn, tránh thư rác và giữ an toàn cho hộp thư đến thông qua các bí danh và Địa chỉ email tạm thời của chúng tôi. Trải nghiệm dịch vụ chuyển tiếp Email miễn phí và ứng dụng cho mọi hệ điều hành.
20.686 20686 đánh giá của người dùng
Tuyệt vời!

AdGuard Wallet

Ví tiền điện tử an toàn và riêng tư giúp bạn kiểm soát hoàn toàn tài sản của mình. Quản lý nhiều ví và khám phá hàng nghìn loại tiền điện tử để lưu trữ, gửi và trao đổi
Việc tải xuống AdGuard đã bắt đầu Nhấp vào nút có hình mũi tên để bắt đầu cài đặt. Chọn "Mở" và nhấp vào "OK", sau đó đợi tệp được tải xuống. Trong cửa sổ đã mở, kéo biểu tượng AdGuard vào thư mục "Ứng dụng". Cảm ơn bạn đã chọn AdGuard! Chọn "Mở" và nhấp vào "OK", sau đó đợi tệp được tải xuống. Trong cửa sổ mở, nhấp vào "Cài đặt". Cảm ơn bạn đã chọn AdGuard!
Cài đặt AdGuard cho cả thiết bị di động