Mark ở vũ trụ khácENMark học AI
Mark ở vũ trụ khác Giải phẫu thảm họa · Tài chính · Phần mềm

Knight Capital

45 phút

Knight Capital Americas · 1/8/2012 · Sàn chứng khoán New York

Chuyện gìmột máy chủ bắn lệnh liên tục suốt khoảng 45 phút
Thiệt hạikhoảng 460 triệu USD, công ty suýt sụp
Nguyên nhân gốccode cũ bị đánh thức trên 1 trong 8 máy chủ quên cập nhật
Nguồn chínhQuyết định SEC số 34-70694, 16/10/2013
Đọc lại trong 1 phút

Tinh hoa

1 trên 8 máy chủCode mới được chép lên từng máy. Một máy bị sót, không ai kiểm tra lại.
Một lá cờ dùng lạiCờ bật tính năng mới từng là cờ bật "Power Peg", code bỏ không từ 2003.
Lệnh không biết dừng212 lệnh của khách thành hơn 4 triệu lần khớp, 397 triệu cổ phiếu.
97 email không ai đọcHệ thống báo "Power Peg disabled" từ 8:01, nhưng đó không được thiết kế là cảnh báo.
Không có nút dừngKhông quy trình xử lý sự cố. Cú gỡ code vội còn làm cả 8 máy cùng hỏng.

Nguồn: Quyết định SEC số 34-70694 (16/10/2013), đoạn 13–17, 19, 21 và 27.

Phần 1

Câu hỏi của vụ án

Một công ty chiếm khoảng 10% giao dịch cổ phiếu niêm yết ở Mỹ, sống bằng phần mềm, vì sao lại mất gần nửa tỷ USD chỉ vì một lần cập nhật? Câu trả lời không phải một kỹ thuật viên sơ suất, mà là một quy trình triển khai không có lưới an toàn nào.

Nguồn: Quyết định SEC 34-70694, đoạn 11 (khoảng 10% giao dịch) và đoạn 17 (khoản lỗ).

2003–2005Code chếtPower Peg bị bỏ nhưng vẫn nằm trên máy. Năm 2005 bị sửa mà không test lại.
→
27/7/2012Triển khai thiếu kiểm traCode mới chép lên 8 máy chủ. Sót 1 máy. Không ai kiểm tra lại.
→
1/8/201245 phútMáy thứ 8 bắn lệnh không ngừng. Công ty ôm vị thế hàng tỷ USD.
Phần 2

Chuyện gì đã xảy ra

Mốc thời gian lấy từ quyết định của SEC; khoản lỗ lấy từ thông cáo của chính Knight.

Sáng 1/8/2012. Từ khoảng 8 giờ 01, một hệ thống nội bộ gửi email báo lỗi "Power Peg disabled", tổng cộng 97 email trước giờ mở cửa 9 giờ 30. Lúc 9 giờ 30, máy chủ thứ tám bắt đầu bắn lệnh con liên tục. Trong khoảng 45 phút: hơn 4 triệu lần khớp lệnh ở 154 mã cổ phiếu, hơn 397 triệu cổ phiếu. Giữa chừng, Knight gỡ code mới khỏi bảy máy chủ tốt, khiến cả tám máy cùng chạy code cũ. Kết thúc: vị thế mua ròng khoảng 3,5 tỷ USD và bán ròng khoảng 3,15 tỷ USD. 97 email "Power Peg disabled" không ai coi là cảnh báo khoảng 45 phút lệnh tuôn ra 8:01email đầu tiên 9:30 · mở cửamáy thứ 8 bắn lệnh gỡ code mớikhỏi 7 máy tốt→ cả 8 máy hỏng vị thếmua 3,5 tỷ USDbán 3,15 tỷ USD 212 lệnh của khách → hơn 4 triệu lần khớp · 154 mã · hơn 397 triệu cổ phiếu thang thời gian minh họa, không đúng tỷ lệ · giờ miền Đông nước Mỹ
Lỗi đã lên tiếng trước giờ mở cửa. 97 email nhắc thẳng tên Power Peg, nhưng chúng không được thiết kế là cảnh báo và thường không ai đọc. SEC không ghi giờ kết thúc chính xác, chỉ ghi "khoảng 45 phút".Nguồn: Quyết định SEC 34-70694, đoạn 16–17 (45 phút, 212 lệnh, 4 triệu lần khớp, 154 mã, 397 triệu cổ phiếu, vị thế), 19 (97 email, 8:01) và 27 (gỡ code).
2003 · Bỏ Power Peg, nhưng không xóaTính năng cũ không còn dùng. Code vẫn nằm trong bộ định tuyến lệnh SMARS và vẫn gọi được nếu bật đúng cờ.
2005 · Sửa mà không test lạiPhần đếm số cổ phiếu đã khớp, thứ giúp lệnh biết khi nào dừng, bị dời đi chỗ khác. Power Peg không được kiểm thử lại.
10/2011 · Một cảnh báo khácDữ liệu thử nghiệm bị dùng nhầm để báo giá thật, lỗ gần 7,5 triệu USD. Knight vá đúng chỗ đó, không rà soát rộng hơn.
Từ 27/7/2012 · Triển khai code mớiĐể tham gia chương trình RLP mới của sàn NYSE. Code mới dùng lại cờ của Power Peg. Một kỹ thuật viên không chép code lên 1 trong 8 máy chủ.
1/8/2012 · Khoảng 45 phútMáy thứ 8 chạy code cũ, bắn lệnh con liên tục cho mỗi lệnh mẹ, không biết lệnh đã khớp đủ.
2/8/2012 · Knight lên tiếng"Sự cố công nghệ" liên quan đến "việc cài đặt phần mềm giao dịch", lỗ trước thuế khoảng 440 triệu USD.
6/8/2012 · Được cứu400 triệu USD cổ phần ưu đãi từ 6 nhà đầu tư, chuyển đổi ở giá 1,50 USD mỗi cổ phiếu.
16/10/2013 · SEC kết luậnPhạt 12 triệu USD. Vụ cưỡng chế đầu tiên của SEC theo quy định tiếp cận thị trường (Rule 15c3-5).

Nguồn: Quyết định SEC 34-70694, đoạn 13–15 (2003, 2005, triển khai), 33 (sự cố 10/2011), 16 (1/8); thông cáo Knight 2/8/2012 (8-K) và 6/8/2012; thông cáo SEC 2013-222.

Kỳ 1

Chuyện gì đã xảy ra

45 phút8 máy chủ97 email460 triệu USD
Kỳ 2

Vì sao

cờ dùng lạitriển khai thiếu kiểm trakhông nút dừnglời đồn
Kỳ 3

Bài học làm việc

danh sách kiểm traxóa code chếtnút dừng khẩn cấp
Phần 3

Vì sao: năm lớp nguyên nhân

Lớp kỹ thuật: một lá cờ, hai nghĩa

repurposed flag · dead codeSEC, đoạn 13–16
Một lệnh mẹ của khách đến với cờ RLP được bật. Ở bảy máy chủ đã cập nhật, cờ này kích hoạt code RLP mới, lệnh được xử lý đúng. Ở máy chủ thứ tám chưa cập nhật, cùng lá cờ đó kích hoạt code Power Peg cũ, vốn đã mất phần đếm số cổ phiếu đã khớp từ năm 2005, nên nó gửi lệnh con không ngừng. lệnh mẹ của khách cờ = BẬT 7 máy đã cập nhật cờ → code RLP mới máy thứ 8, bị sót cờ → Power Peg (2003) khớp đủ thì dừngxử lý đúng không biết đã khớpgửi lệnh con mãi
Code mới không sai. Nó chạy đúng trên 7 máy. Cái nguy là code cũ vẫn còn đó, và lá cờ mới trùng với lá cờ cũ. Knight định xóa Power Peg nhưng chưa xóa.Nguồn: Quyết định SEC 34-70694, đoạn 13 (cờ dùng lại, ý định xóa Power Peg), 14 (2003, 2005, không test lại) và 16 (7 máy đúng, máy thứ 8 gửi lệnh liên tục).

Lớp triển khai: sót một máy, không người thứ hai

unverified deployment · no peer reviewSEC, đoạn 15 và 26
Tám máy chủ SMARS. Bảy máy nhận code mới. Máy thứ tám không được chép. Không có kỹ thuật viên thứ hai kiểm tra, không có quy trình viết bắt buộc kiểm tra, không có quy trình viết cho việc phát triển và triển khai code của SMARS. mớimớimớimớimớimớimới CŨ bị sót ✗ không kỹ thuật viên thứ hai kiểm tra ✗ không quy trình viết bắt buộc kiểm tra ✗ không quy trình viết cho triển khai code SMARS (các nhóm khác thì có)
Sai sót của một người, lỗ hổng của cả quy trình. SEC không chỉ ghi "một kỹ thuật viên không chép code". SEC ghi thêm: không ai được giao kiểm tra lại, và không có văn bản nào bắt phải kiểm tra.Nguồn: Quyết định SEC 34-70694, đoạn 15 (1 trong 8 máy, không người thứ hai, không quy trình viết) và 26 (không quy trình phát triển và triển khai code cho SMARS).

Lớp khuếch đại: từ 212 lệnh đến hàng tỷ USD

amplificationSEC, đoạn 17–18
212 lệnh mẹ biến thành hơn 4 triệu lần khớp ở 154 mã, hơn 397 triệu cổ phiếu. Vị thế cuối: mua ròng khoảng 3,5 tỷ USD ở 80 mã, bán ròng khoảng 3,15 tỷ USD ở 74 mã. Khoản lỗ khoảng 460 triệu USD. Ở 75 mã giá biến động hơn 5 phần trăm, trong đó 37 mã hơn 10 phần trăm. 212lệnh mẹ → > 4 triệulần khớp lệnh → > 397 triệucổ phiếu · 154 mã mua ròng~3,5 tỷ USD · 80 mã bán ròng~3,15 tỷ USD · 74 mã lỗ~460 triệu USD giá: 75 mã biến động hơn 5% · 37 mã hơn 10% (ở 37 mã này Knight chiếm hơn nửa khối lượng)
Tự động hóa phóng đại cả cái sai. SEC viết: thiếu kiểm soát, tự động hóa có thể biến "một lỗi lẽ ra xử lý được thành một sự kiện cực đoan".Nguồn: Quyết định SEC 34-70694, đoạn 3 (trích dẫn), 17 (số lệnh, vị thế, lỗ 460 triệu USD) và 18 (biến động giá).

Lớp giám sát: tín hiệu có, cảnh báo không

signals that are not alarmsSEC, đoạn 19, 21–25
Ba lớp giám sát đều không bật còi. 97 email báo lỗi không được thiết kế là cảnh báo. Công cụ theo dõi rủi ro chính PMON hoàn toàn dựa vào người nhìn, không có cảnh báo tự động. Tài khoản 33 có hạn mức 2 triệu USD nhưng không gắn với chặn tự động. SMARS cũng không so lệnh đi ra với lệnh đi vào. 97 email BNET "Power Peg disabled" không phải cảnh báothường không ai đọc PMON công cụ rủi ro chính chỉ dựa vào người nhìnkhông cảnh báo tự động Tài khoản "33" hạn mức 2 triệu USD không nối với chặn tự độngvượt mức vẫn chạy và SMARS không so lệnh đi ra với lệnh đi vào.
Một hệ thống chỉ dựa vào mắt người sẽ chậm hơn một máy gửi lệnh tốc độ cao. Các con số giới hạn có trên giấy, nhưng không con số nào được nối với một cái chặn tự động.Nguồn: Quyết định SEC 34-70694, đoạn 19 (97 email, "không được thiết kế là cảnh báo"), 21 (không theo dõi đầu ra), 22–24 (hạn mức, tài khoản 33) và 25 (PMON).

Lớp ứng phó: không có nút dừng, cú gỡ làm tệ hơn

no kill switch · no incident playbookSEC, đoạn 21 và 27
Trước khi gỡ: một trong tám máy chạy code cũ. Knight gỡ code mới khỏi bảy máy tốt, với ý định quay về trạng thái cũ. Sau khi gỡ: cả tám máy đều chạy code cũ, vì lá cờ trong lệnh vẫn bật Power Peg. trước khi gỡ 1/8 máy hỏng gỡ code mới sau khi gỡ 8/8 máy hỏng không quy trình dừng SMARS khi nó hành xử bất thường · không quy trình ứng phó sự cố sửa lỗi ngay trong giờ giao dịch, chủ yếu trông vào đội công nghệ
"Quay về bản cũ" chỉ an toàn khi bản cũ an toàn. Lá cờ trong lệnh của khách vẫn bật, nên gỡ code mới đồng nghĩa với đánh thức Power Peg trên cả 7 máy còn lại. Knight có cơ chế tự ngắt cho một số chiến lược của một nhóm giao dịch, nhưng không cho SMARS.Nguồn: Quyết định SEC 34-70694, đoạn 21 (không quy trình dừng SMARS), 27 (không quy trình ứng phó sự cố, gỡ code làm tệ hơn) và chú thích 7 (tự ngắt cho một số chiến lược).

Giấy tờ nói "đạt"

Đánh giá tuân thủ ban đầu kết luận hệ thống kiểm soát của Knight đáp ứng Rule 15c3-5 (SEC, đoạn 28).

Sự cố cũ, vá hẹp

Vụ lỗ gần 7,5 triệu USD tháng 10/2011 được vá đúng chỗ, không dẫn tới rà soát rộng (SEC, đoạn 33).

Chữ ký mềm

Chứng nhận của CEO (3/2012) ghi Knight có "quy trình" để tuân thủ, không ghi rằng kiểm soát đã tuân thủ (SEC, đoạn 34).
Phần 4

Kiểm chứng: chuyện thật và lời đồn

12 điều hay được kể về Knight Capital, đối chiếu với quyết định của SEC và hồ sơ Knight nộp cho SEC. Bấm từng dòng để xem lý do.

Ba con số về khoản lỗ. Ngày 2/8/2012, Knight ước tính lỗ trước thuế khoảng 440 triệu USD. Ngày 17/10/2012, báo cáo quý 3 ghi lỗ giao dịch 457,6 triệu USD, tổng 461,1 triệu USD kể cả phí. Năm 2013, SEC ghi 460 triệu USD. 2/8/2012 · Knight ước tính~440 triệu 17/10/2012 · báo cáo quý 3457,6 triệu lỗ giao dịch 16/10/2013 · SEC"hơn 460 triệu USD"
Ba con số, không mâu thuẫn mà khác thời điểm. Số 440 là ước tính ngày hôm sau; 457,6 là số ghi sổ; 460 là số của SEC. Lệnh tuôn ra trong khoảng 45 phút, còn khoản lỗ thành hình khi Knight bán gỡ vị thế sau đó.Nguồn: thông cáo Knight 2/8/2012 (8-K, phụ lục 99.1); thông cáo kết quả quý 3/2012 của Knight (17/10/2012); Quyết định SEC 34-70694, đoạn 1 và 17.
VỮNGLệnh lỗi tuôn ra trong khoảng 45 phút

SEC ghi "khoảng 45 phút" ở đoạn 1, 10 và 17. SEC không ghi giờ kết thúc chính xác, nên bài này không ghi.

VỮNGLỗi đến từ code bỏ không từ 2003, sửa năm 2005 mà không test lại

SEC, đoạn 14: Knight ngừng dùng Power Peg năm 2003; năm 2005 dời phần đếm cổ phiếu đã khớp và "không test lại" Power Peg.

VỮNGGỡ code mới ra lại làm sự cố tệ hơn

SEC, đoạn 27: Knight gỡ code RLP khỏi 7 máy chủ tốt; lệnh đến sau đó kích hoạt Power Peg trên cả 7 máy.

VỮNGKnight chiếm khoảng 10% giao dịch cổ phiếu niêm yết ở Mỹ

SEC, đoạn 11, cho năm 2011–2012. Riêng SMARS khoảng 1% hoặc hơn.

VỮNGBị phạt 12 triệu USD, vụ đầu tiên theo quy định tiếp cận thị trường

Thông cáo SEC 2013-222: "vụ cưỡng chế đầu tiên của SEC theo quy định tiếp cận thị trường". Knight đồng ý dàn xếp, "không thừa nhận cũng không phủ nhận" các kết luận.

THẬN TRỌNG"Chỉ vì một kỹ thuật viên quên chép file"

Đúng là ngòi nổ (đoạn 15). Nhưng phần lớn quyết định của SEC nói về thứ khác: không quy trình triển khai viết thành văn, không người kiểm tra lại, không theo dõi đầu ra, không nút dừng, không quy trình ứng phó sự cố (đoạn 15, 21–27).

THẬN TRỌNG"Mất 440 triệu USD trong 45 phút"

440 triệu là ước tính đầu tiên của Knight. Số ghi sổ là 457,6 triệu lỗ giao dịch; SEC ghi 460 triệu. Lệnh tuôn ra trong 45 phút, nhưng lỗ được chốt khi bán gỡ vị thế sau đó.

THẬN TRỌNG"Có 97 email cảnh báo mà không ai thèm đọc"

97 email là có thật (đoạn 19). Nhưng SEC ghi rõ chúng "không được thiết kế là cảnh báo hệ thống". Bài học là về cách thiết kế cảnh báo, không phải nhân viên lười.

THẬN TRỌNG"Code mới viết sai"

Code RLP mới chạy đúng trên 7 máy (đoạn 16). Cái nguy là code cũ chưa xóa, lá cờ bị dùng lại, và một máy bị sót.

THẬN TRỌNG"Knight không có nút dừng nào cả"

SMARS không có quy trình dừng khi hành xử bất thường (đoạn 21), và không có quy trình ứng phó sự cố (đoạn 27). Nhưng Knight có tự ngắt cho một số chiến lược của một nhóm giao dịch (chú thích 7).

SAI"Một thuật toán AI nổi loạn"

Không có AI hay máy học nào trong hồ sơ. Đây là một đoạn code định tuyến lệnh cũ, chạy đúng như nó được viết, bị đánh thức bởi một lá cờ dùng lại trên một máy chủ chưa cập nhật (SEC, đoạn 13–16).

SAI"Knight phá sản ngay hôm đó"

Ngày 6/8/2012, Knight nhận 400 triệu USD từ Jefferies, Blackstone, GETCO, Stephens, Stifel và TD Ameritrade. Số vốn này chuyển đổi được thành khoảng 267 triệu cổ phiếu, ở giá 1,50 USD mỗi cổ phiếu. Ngày 1/7/2013, Knight và GETCO hợp nhất thành KCG Holdings.

Nguồn: Quyết định SEC 34-70694 (các đoạn ghi trong từng dòng); thông cáo SEC 2013-222; thông cáo Knight 2/8/2012, 6/8/2012 và 17/10/2012.

Phần 5

Đánh giá vụ việc

Điểm là đánh giá của Mark dựa trên các nguồn ở Phần 8, không phải số liệu của một nghiên cứu.

Có thể tránh được
5/5
Cảnh báo có từ trước
4/5
Điều tra minh bạch
4/5
Bài học được giữ lại
3/5
Làm đúng sau thảm họa
  • Gỡ phần mềm lỗi, công bố khoản lỗ ngay hôm sau
  • Gọi vốn cứu công ty trong 5 ngày
  • SEC công bố hồ sơ chi tiết, đặt chuẩn cho quy định mới
Làm chưa đúng
  • Sự cố 2011 chỉ được vá hẹp
  • Giấy tờ tuân thủ nói "đạt" khi thực tế chưa
  • Dàn xếp không thừa nhận lỗi, khó biết ai chịu trách nhiệm gì

Không có kẻ ác, không có AI. Chỉ có một quy trình triển khai thiếu mọi lưới an toàn, gặp một máy gửi lệnh nhanh hơn con người.

Xem thêm: vì sao đây là bài học cho mọi đội phần mềm

Bỏ chữ "chứng khoán" đi, phần còn lại là chuyện thường ngày của mọi đội làm phần mềm: một tính năng cũ không ai xóa, một cờ cấu hình được dùng lại cho tiết kiệm, một lần chép code lên nhiều máy mà không ai kiểm tra lại, một kênh email báo lỗi mà ai cũng lọc vào thư mục riêng.

Điều khác biệt ở Knight là tốc độ. Một máy gửi lệnh tự động có thể làm trong vài phút điều mà con người cần cả tuần mới làm nổi. Vì thế SEC nhấn mạnh rằng kiểm soát phải tự động như chính hệ thống, và việc dừng hệ thống phải được chuẩn bị trước, không phải nghĩ ra giữa sự cố.

Nguồn phần "Xem thêm": Quyết định SEC 34-70694, đoạn 3–4 (vai trò của kiểm soát trong giao dịch tự động); phần còn lại là nhận xét của Mark.

Phần 6

Bài học làm việc: triển khai có danh sách kiểm tra và nút dừng

Áp dụng cho mọi lần "đẩy lên thật": cập nhật phần mềm, đổi cấu hình, gửi email hàng loạt, chạy chiến dịch quảng cáo.

Bốn bước cho mỗi lần triển khai: tự động hóa và kiểm tra mọi máy đích, xóa code chết và không dùng lại cờ, thiết kế cảnh báo thật và so đầu ra với đầu vào, chuẩn bị nút dừng và quy trình sự cố viết sẵn. 1 · kiểm đủ mọi máy"8/8 cùng phiên bản"tự động, có người thứ hai 2 · xóa code chếtcờ mới, tên mớikhông dùng lại cờ cũ 3 · cảnh báo là cảnh báoso ra với vàohạn mức tự chặn 4 · nút dừng viết sẵnai bấm, khi nàodừng trước, sửa sau Câu "chắc chép đủ rồi" không phải bằng chứng đã chép đủ.
Mỗi bước vá một chỗ hỏng sáng 1/8. Máy bị sót, cờ dùng lại, email không ai đọc, và một cú gỡ code nghĩ ra giữa sự cố.Nguồn: các chỗ hỏng lấy từ Quyết định SEC 34-70694, đoạn 13–15, 19, 21–27; các bước là đề xuất của Mark.
Danh sách kiểm tra có tên người kýLiệt kê mọi máy đích. Sau triển khai, một người khác xác nhận từng máy chạy đúng phiên bản.
Xóa thứ không dùngCode, cờ, tài khoản, quyền truy cập bỏ không chín năm là chín năm rủi ro nằm chờ.
Ít cảnh báo, nhưng cảnh báo thậtMột kênh nhận 97 email mà không ai đọc thì bằng không có kênh. Lọc ồn, chỉ để lại thứ bắt người phải dậy.
Tập dừng trước khi cần dừngViết sẵn: ai được dừng, dừng bằng cách nào, khi nào thì dừng. Đừng "quay về bản cũ" khi chưa biết bản cũ có an toàn không.
Không có kiểm soát phù hợp, tự động hóa có thể biến một lỗi lẽ ra xử lý được thành một sự kiện cực đoan.SEC, Quyết định 34-70694, đoạn 3 (2013), Mark dịch.
Phần 7

Đọc tiếp

SEC, Quyết định 34-70694 (2013)Văn bản ngắn, đọc như một bản phân tích sự cố. Đoạn 12–27 là phần cốt lõi.
Thông cáo của Knight ngày 2/8 và 6/8/2012Xem một công ty mô tả sự cố của chính mình trong vòng 24 giờ, rồi gọi vốn cứu mình trong 5 ngày.
Google, Site Reliability Engineering (2016), các chương về triển khai và xử lý sự cốCách các đội lớn làm triển khai từng phần, rút lui an toàn và quy trình sự cố.
Giải phẫu thảm họa #06: Titanic (1912)Khi quy định đi sau công nghệ, và vì sao phải lên kế hoạch cho tình huống xấu nhất.
Phần 8

Nguồn gốc

Ưu tiên tài liệu gốc: quyết định của cơ quan quản lý và hồ sơ công ty nộp cho SEC.

  1. SEC, In the Matter of Knight Capital Americas LLC, Exchange Act Release No. 70694, Admin. Proc. File No. 3-15570, 16/10/2013, phần III, đoạn 1–51. sec.gov
  2. SEC, thông cáo báo chí 2013-222, "SEC Charges Knight Capital With Violations of Market Access Rule", 16/10/2013. sec.gov
  3. Knight Capital Group, thông cáo 2/8/2012, Form 8-K, phụ lục 99.1. sec.gov/Archives
  4. Knight Capital Group, "Knight Capital Group Completes $400 Million Equity Financing Agreement", 6/8/2012, Form 8-K, phụ lục 99.1. sec.gov/Archives
  5. Knight Capital Group, thông cáo kết quả quý 3/2012, 17/10/2012, Form 8-K, phụ lục 99.1. sec.gov/Archives