#161 - Lợi dụng Dependency Confusion để hack vào Apple, Microsoft
Những bài viết hay
FOQS: Scaling a distributed priority queue — engineering.fb.com
Facebook Ordered Queueing Service (FOQS) là một hệ thống priority queue phân tán được Facebook xây dựng để hỗ trợ các dịch vụ cần dựa trên một priority queue mà có thể scale một cách dễ dàng và bền vững. Hiện tại, FOQS tiếp nhận và xử lý khoảng gần 1 nghìn tỷ tác vụ mỗi ngày. Hệ thống FOQS cung cấp 3 hoạt động chính:
Enqueue: được client dùng để bỏ một tác vụ vào FOQS. Những lệnh enqueue này sẽ được FOQS tiếp nhận trong một buffer rồi trả về một Promise object cho client khi các lệnh này được đặt vào buffer thành công. Sau đó, các enqueue worker của FOQS sẽ truy vấn request buffer này và lưu dữ liệu vào các MySQL shards. Nếu thành công thì FOQS sẽ kích hoạt Promise object trước đó với một id riêng biệt bao gồm MySQL shard id và primary key id của tác vụ được bỏ vô queue
Dequeue: được client dùng để truy vấn các tác vụ của họ ở FOQS. Những lệnh dequeue này sẽ được FOQS tiếp nhận và xử lý bằng cách truy vấn dữ liệu ở một prefetch buffer. Các prefetch buffer này được xây dựng bằng cách dùng một hệ thống ở background để truy vấn dữ liệu các tác vụ cần được ưu tiên ở các MySQL shards
Ack/Nack: được dùng để công bố tín hiệu từ client tới FOQS nếu một tác vụ được truy vấn và xử lý thành công hay không. Những tín hiệu này sẽ giúp FOQS nhận biết nếu một tác vụ cần được chạy lại hay không
Bài viết sau đây được các đội ngũ kỹ sư ở Facebook nói rõ hơn về cách họ xây dựng hệ thống FOQS như thế nào và những cách họ tối ưu hóa hệ thống để có thể hoạt động một cách bền vững hơn.
Những Architectural Patterns quan trọng nhất bạn cần biết — levelup.gitconnected.com
Architectural Pattern là một giải pháp chung, có thể tái sử dụng cho một vấn đề thường xảy ra trong kiến trúc phần mềm trong một ngữ cảnh nhất định. Nhiều lập trình viên vẫn còn nhầm lẫn về sự khác biệt giữa các patterns này hoặc thậm chí chưa biết nhiều về chúng.
Trong bài viết, tác giả sẽ phân tích chi tiết các mô hình kiến trúc phổ biến cũng như ưu nhược điểm của chúng:
Layered Architecture: Tất cả các hệ thống phức tạp đều cần phải phát triển các phần của hệ thống một cách độc lập. Vì lý do này, việc phát triển cần sự tách biệt rõ ràng và được document chi tiết, để các module của hệ thống có thể được phát triển và duy trì một cách độc lập. Layered Architecture thường được chia ra làm 4 lớp như sau: presentation, business, persistence và database.
Multi-Tier Pattern: Trong triển khai phân tán, thường có nhu cầu phân phối cơ sở hạ tầng của hệ thống thành các tập hợp con riêng biệt. Làm thế nào chúng ta có thể chia hệ thống thành một số cấu trúc thực thi độc lập về mặt tính toán? Giải pháp được đưa ra là hệ thống sẽ được tổ chức như một tập hợp các nhóm, mỗi nhóm sẽ có một logic thực thi riêng và được gọi là một bậc (tier). Ví dụ như: client tier, web tier, backend tier, ...
Pipe and Filter: Nhiều hệ thống được yêu cầu để transform các luồng dữ liệu rời rạc, từ đầu vào đến đầu ra. Nhiều transformation xảy ra lặp đi lặp lại trong thực tế, và vì vậy chúng ta mong muốn tạo ra chúng như những components độc lập, có thể tái sử dụng.
Client Server: client gửi request đến server và nhận lại phải hồi từ server.
Model View Controller (MVC): chia ứng dụng thành 3 lớp là Model để chứa dữ liệu của ứng dụng, View để hiện thị và Controller để quản lý các thông báo thay đổi trạng thái, và kết nối Model và View.
Event Driven Architecture: Triển khai các event processes/processors độc lập để xử lý các events. Các events đến được xếp hàng đợi. Sau đó các process khác nhau sẽ đọc và xử lý các events.
Microservices Architecture: xây dựng một ứng dụng mà ứng dụng này là tổng hợp của nhiều services nhỏ và độc lập có thể chạy riêng biệt, phát triển và triển khai độc lập.
Lợi dụng Dependency Confusion để hack vào hệ thống của các công ty hàng đầu thế giới — medium.com
Ngày nay rất nhiều công ty sử dụng Public Package Manager để tận dụng lợi thế rất lớn mang lại từ hệ sinh thái open-source. Một số Public Package Manager phổ biến bao gồm npm, NuGet Gallery, PyPI (Python Package Index), RubyGems, Maven Central. Chắc hẳn bạn không hề lạ lẫm với câu lệnh npm install some-package. Tuy nhiên, bạn có biết câu lệnh đơn giản này có thể gây ra các lỗ hổng bảo mật nguy hiểm. Điều đó có thể xảy ra như thế nào?
Bên cạnh sử dụng Public Package Manager, các công ty cũng sử dụng Private Packages Manager để quản lý và chia sẻ các internal packages. Câu hỏi đặt ra là nếu cả Public Package Manager và Private Package Manager đều có package cùng tên thì câu lệnh npm install sẽ đặt package nào?
Dựa vào nghi vấn này, Alex Birsan đã thực hiện một thử nghiệm bằng cách tìm các private packages của một số công ty lớn như PayPal, Apple Yelp, Tesla, Shopify, Netflix v.v. Sau đó tiến hành đăng kí 'malicious' package cùng tên trên Public Package Manager để thu thập thông tin về máy tính/server khi tiến hành cài đặt malicious package.
Để tránh các vấn đề pháp lý Alex Birsan đã thực hiện điều này thông qua các chương trình "bug bounty" công khai hoặc đã nhận được sự cho phép của các công ty mục tiêu. Do đó bạn KHÔNG NÊN thực hiện điều này nếu chưa được sự cho phép của công ty mục tiêu.
Kết quả thành công đáng kinh ngạc. Lỗ hổng này - dependency confusion hay còn được biết đến với tên gọi substitution attack - đã được phát hiện bên trong hơn 35 tổ chức/công ty (tại thời điểm bài viết) trên cả ba ngôn ngữ Node, Python và Ruby. Tất nhiên các công ty/tổ chức này đã xây dựng giải pháp thay thế để khắc phục lỗ hổng này. Để biết thêm chi tiết về nguyên nhân gốc rễ (root cause) và giải pháp khắc phục, bạn có thể xem tài liệu "3 Ways to Mitigate Risk When Using Private Package Feeds" được Microsoft công bố gần đây.
Góc Database
Cấu trúc dữ liệu dạng đồ thị (graph) có thể được xem là một trong các loại CTDL có ứng dụng rộng rãi nhất trong Khoa học máy tính hiện đại. Đồ thị được sử dụng để biểu diễn mạng xã hội (social network), mạng tri thức (knowledge graph), mạng máy tính, …
Sự phát triển ngày càng mạnh của các hệ thống thông minh, chi phí lưu trữ rẻ cũng dẫn đến các đồ thị cũng ngày càng phình to về mặc kích cỡ đôi khi lên đến hàng Tera-bytes, Peta-bytes. Lượng dữ liệu lớn như thế này cũng thường được chia ra lưu trữ trên nhiều server thay vì tập trung vào một server duy nhất, điều này khiến cho các thuật toán đồ thị truyền thống vốn dựa trên việc tính toán trên memory trở nên thiếu hiệu quả.
Trong bài báo này, các tác giả giới thiệu về PEGASUS, một thư viện chạy trên nền Hadoop, được xây dựng nhằm giúp cho các tác vụ trên đồ thị trở nên dễ dàng hơn với khối lượng lớn.
Nội dung bài báo bao gồm:
Giải thích về GIM-V, một cách mô tả thuật toán nhân ma trận tổng quát hoá từ nhiều thuật toán đồ thị khác nhau.
Cơ chế cài đặt của GIM-V và mối tương quan với các thuật toán đồ thị phổ biến như PageRank (dùng trong cỗ máy tìm kiếm của Google), RWR (Random Walk with Restart), ước tính bán kính, …
Phân tính về performance của thuật toán
Ứng dụng thuật toán trong quá trình phân tích đồ thị web được tạo ra bởi Yahoo, một trong các đồ thị có kích thước thuộc hàng lớn nhất ở thời điểm bài báo được đưa ra.
Góc Data Warehouse
Apache ORC (Optimized Row Columnar) được thành lập vào năm 2013 từ sự hợp tác giữa các đội ngũ kỹ sư ở Facebook và HortonWorks - công ty chuyên phát triển và bảo trì những dự án liên quan tới Apache Hadoop. Apache ORC là một trong những định dạng tập tin theo việc lưu trữ cột dữ liệu (columnar-storage file format) phổ biến cho các data warehouse hiện giờ, đặc biệt là cho các warehouse dựa trên Apache Hive.
Mỗi ORC file sẽ được chia ra thành nhiều phần nhỏ với mỗi phần chứa 256MB, gọi là stripe. Trong mỗi stripe, ORC sẽ dùng một vài cách thức mã hóa cho các giá trị ở mỗi cột dữ liệu và sau đó sẽ nén những cột dữ liệu này với các thư viện codec nổi tiếng như là zlib hoặc snappy. Một ví dụ điển hình như là các cột dữ liệu theo dạng string thường thì sẽ được mã hóa theo dạng dictionary encoding khi mà các giá trị string riêng biệt của cột đó được chứa trong một dictionary và các giá trị ở mỗi cột sẽ có một pointer nhỏ chỉ về giá trị trong dictionary này. Từ đó, dictionary encoding có thể giảm dung lượng chứa cho từng giá trị dữ liệu ở mỗi cột do không cần phải sao chép các giá trị trùng lặp nhiều lần. Do ORC sẽ nén các giá trị mã hóa này sau khi mã hóa xong nên mỗi stripe ở ORC đều được tối ưu hóa đáng kể.
Đồng thời, để giúp cho các big data compute engines như là Presto và Spark có thể truy vấn dữ liệu một cách hiệu quả, mỗi ORC stripe thường sẽ chứa index cho mỗi 10k dòng dữ liệu cùng với giá trị nhỏ nhất và lớn nhất ở mỗi cột. Từ đó mà các compute engines có thể bỏ qua các stripe không cần thiết nếu SQL query có các điều kiện sàng lọc ở một cột. Do đa phần thì các data engineers chỉ cần truy vấn vài cột trong các bảng dữ liệu ở data warehouse, việc dùng column-storage file format giúp cải thiện hiệu suất đáng kể so với row-storage file format. Các bạn có thể tham khảo thêm về specification của Apache ORC ở đây và có thể tham khảo thêm cách mà các đội ngũ kỹ sư ở Facebook áp dụng ORC như thế nào để giúp scale data warehouse của họ tới 300PB vào năm 2014 tại đây
Code & Tools
tauri - Build smaller, faster, and more secure desktop applications with a web frontend
avatarify - Avatars for Zoom, Skype and other video-conferencing apps
This Week Sponsors
POPS is a creative, innovative & hyper-growth working environment where storytelling meets technology.
POPS is the leading digital entertainment company in Southeast Asia. With over 12 years in entertainment, we provide thousands of exclusive, high-quality, carefully curated local and international contents and bring a unique entertainment experience through POPS Original series, concerts, movies, comics, esports and more.
We are on a journey to find talents who are passionate about technology and love to develop POPS APP the digital entertainment product with the latest technologies such as: OTT, Video On Demand, Microservices, etc. to give end users in the region great experiences with an all-inclusive digital entertainment platform.
Góc Tuyển Dụng
Visit https://popsww.com/en/careers for current job openings.
Quotes
"How did you know so much about computers? I didn’t, it was the first one”
- Grace Hopper