thảo luận Con trỏ pointer trong C/C++ ưu và nhược

Status
Not open for further replies.
bạn nào thông não với tôi về chuyện google chrome quyết định thêm gc, dùng Miracle<Ptr>, thêm bound checking vì lý do security (với trade off là performance) thì liên quan gì đến pointer với?

thêm nữa, mấy cái buffer overflow nó do null terminated string với bound checking chứ liên quan gì tới pointer nhỉ, tới giờ tôi vẫn đéo hiểu?
 
bạn nào thông não với tôi về chuyện google chrome quyết định thêm gc, dùng Miracle<Ptr>, thêm bound checking vì lý do security (với trade off là performance) thì liên quan gì đến pointer với?

thêm nữa, mấy cái buffer overflow nó do null terminated string với bound checking chứ liên quan gì tới pointer nhỉ, tới giờ tôi vẫn đéo hiểu?
nếu dùng con trỏ thô theo đúng code c thì nó là 1 con trỏ thuần khiết, khi a gọi hàm cấp phát vùng nhớ là malloc hay cấp phát tĩnh thì ở hđh sẽ tạo vùng nhớ đúng với số byte a yêu cầu, nhưng điều đó kok có nghĩa là a kok có thể truy xuất dc vùng nhớ bên ngoài vùng a dc cấp phát, nôm na là con trỏ thô lưu địa chỉ vùng nhớ , còn ai đi bao xa hay đi lùi bao xa từ địa chỉ đó cũng dc, có thể đọc và ghi vào vùng nhớ kok dc cấp phép do a đang dùng con trỏ đều dc cả, điều này sẽ kok ổn ở design software nhưng giới hacker thì rất mê mẫn món này nên đám google hay ms mới ra sức hạn chế con trỏ thô truy xuất lung tung

tôi cũng dính 1 phát vụ con trỏ thô truy xuất vùng nhớ lạ đây, tôi cấp vùng nhớ cho nó dạng byte , kích thước là 256 , nhưng mà index = số âm hay số > 256 nó vẫn get ra đc thông tin và truyền lên server làm mất cả buổi chiều ngẫn ngơ ra vì có ký tự lạ trên hệ thống
 
nếu dùng con trỏ thô theo đúng code c thì nó là 1 con trỏ thuần khiết, khi a gọi hàm cấp phát vùng nhớ là malloc hay cấp phát tĩnh thì ở hđh sẽ tạo vùng nhớ đúng với số byte a yêu cầu, nhưng điều đó kok có nghĩa là a kok có thể truy xuất dc vùng nhớ bên ngoài vùng a dc cấp phát, nôm na là con trỏ thô lưu địa chỉ vùng nhớ , còn ai đi bao xa hay đi lùi bao xa từ địa chỉ đó cũng dc, có thể đọc và ghi vào vùng nhớ kok dc cấp phép do a đang dùng con trỏ đều dc cả, điều này sẽ kok ổn ở design software nhưng giới hacker thì rất mê mẫn món này nên đám google hay ms mới ra sức hạn chế con trỏ thô truy xuất lung tung

tôi cũng dính 1 phát vụ con trỏ thô truy xuất vùng nhớ lạ đây, tôi cấp vùng nhớ cho nó dạng byte , kích thước là 256 , nhưng mà index = số âm hay số > 256 nó vẫn get ra đc thông tin và truyền lên server làm mất cả buổi chiều ngẫn ngơ ra vì có ký tự lạ trên hệ thống

Cũng ko thấy bound check thì liên quan gì con trỏ lắm :shame:

Sent from Xiaomi Redmi K20 using vozFApp
 
nếu dùng con trỏ thô theo đúng code c thì nó là 1 con trỏ thuần khiết, khi a gọi hàm cấp phát vùng nhớ là malloc hay cấp phát tĩnh thì ở hđh sẽ tạo vùng nhớ đúng với số byte a yêu cầu, nhưng điều đó kok có nghĩa là a kok có thể truy xuất dc vùng nhớ bên ngoài vùng a dc cấp phát, nôm na là con trỏ thô lưu địa chỉ vùng nhớ , còn ai đi bao xa hay đi lùi bao xa từ địa chỉ đó cũng dc, có thể đọc và ghi vào vùng nhớ kok dc cấp phép do a đang dùng con trỏ đều dc cả, điều này sẽ kok ổn ở design software nhưng giới hacker thì rất mê mẫn món này nên đám google hay ms mới ra sức hạn chế con trỏ thô truy xuất lung tung

tôi cũng dính 1 phát vụ con trỏ thô truy xuất vùng nhớ lạ đây, tôi cấp vùng nhớ cho nó dạng byte , kích thước là 256 , nhưng mà index = số âm hay số > 256 nó vẫn get ra đc thông tin và truyền lên server làm mất cả buổi chiều ngẫn ngơ ra vì có ký tự lạ trên hệ thống
không không cái này anh sai rồi, kernel sẽ cấp cho anh một vùng bộ nhớ + địa chỉ ảo, cho nên anh không có khả năng truy cập đến vùng bộ nhớ anh không dc quyền truy cập, segfault ngay lập tức:
https://stackoverflow.com/questions...ndom-memory-addresses-outside-of-my-c-program

còn vụ pointer arithmetic thì đúng là ra lắm vấn đề thật, nhưng đó là vấn đề với arithmetic, chứ anh dùng pointer như reference (aka const pointer) thì nó có vấn đề gì đâu, nếu có thì do anh check bound sai :p

thực ra tôi thấy vụ chúng nó khuyến khích dùng wrapper type là bởi vì dùng cái này sẽ buộc phải dùng các function mới được viết đã chú trọng security checking sẵn (mấy cái function cũ nhiều khi không có vì lý do performance) là chính, chứ đổ lỗi hết cho pointer tôi thấy vớ vẩn vãi.
 
không không cái này anh sai rồi, kernel sẽ cấp cho anh một vùng bộ nhớ + address ảo (map lại từ 0x000000 gì gì đó), cho nên anh không có khả năng truy cập đến vùng bộ nhớ anh không dc quyền truy cập, segfault ngay lập tức:
https://stackoverflow.com/questions...ndom-memory-addresses-outside-of-my-c-program

còn vụ pointer arithmetic thì đúng là ra lắm vấn đề thật, nhưng đó là vấn đề với arithmetic, chứ anh dùng pointer như reference (aka const pointer) thì nó có vấn đề gì đâu, nếu có thì do anh check bound sai :p

thực ra tôi thấy vụ chúng nó khuyến khích dùng wrapper type là bởi vì dùng cái này sẽ buộc phải dùng các function mới được viết đã chú trọng security checking sẵn (mấy cái function cũ nhiều khi không có vì lý do performance) là chính, chứ đổ lỗi hết cho pointer tôi thấy vớ vẩn vãi.
tất nhiên lỗi trong code thì thấy là fix thôi nhưng mà tôi bị dính phát index tới mấy chục k trong khi tôi chỉ cấp cho nó có 256 nó vẫn get ra thông tin và đẩy lên server hay index âm thì vẫn lấy dc chứng tỏ là mấy cái lý thuyết xuông bên trên nó cũng khá là vô nghĩa, vì tôi đã chứng minh là nó sai rồi đây, thậm chí là ứng dụng chả crash mẹ j cả, à tôi chạy trên android & windows bị dính, còn ios thì chưa kịp tesy thì fix rùi :D

còn kok tin a cứ test lại, nhớ dùng malloc hay mảng tĩnh nhé, compiler là code c chứ kok phải cpp, dùng gcc cũng dc
 
tất nhiên lỗi trong code thì thấy là fix thôi nhưng mà tôi bị dính phát index tới mấy chục k trong khi tôi chỉ cấp cho nó có 256 nó vẫn get ra thông tin và đẩy lên server hay index âm thì vẫn lấy dc chứng tỏ là mấy cái lý thuyết xuông bên trên nó cũng khá là vô nghĩa, vì tôi đã chứng minh là nó sai rồi đây
ờ có thể là app của anh nó tự động allocate memory ở đâu đó, địa chỉ anh truy cập vẫn nằm trong program của anh, chứ chuyện anh có thể truy cập ram ngẫu nhiên của hệ thống là hoàn toàn không thể nào (trừ khi os anh dùng chỉ có ring 0 như temple os =) )
vụ này cực kỳ quan trọng vì nếu process này đọc được memory của process kia thì cần vẹo gì spectre hay meltdown, chỉ cần upload program lên cái vps là trộm sạch được thông tin của cả cái dedicated server bên ngoài rồi :(
 
Gần đây mình có biết là khi pass pointer vào function, sẽ mất thêm thời gian để Escape Analysis check xem value đang là trên stack hay heap, nếu là heap thì lại tốn xíu thời gian nữa để chạy garbage collector. Nên nếu nói dùng pointer thì nhanh hơn thì chưa hẳn. Với lại dùng poniter có cảm giác nó không pure lắm.
 
Last edited:
Pointer nó như 1 công cụ đa năng vậy. Xài ko đúng cách thì sẽ phát sinh nhiều vấn đề.

Trong C++ ko có GC vì vấn đề performance. Ngay cả smartpointer thì tạm coi như là 1 bản fix cho quá nhiều lỗi xảy ra trên các hệ thống lớn với raw pointer. Cái smartpointer rất hay, nhưng mà các codebase lớn ko chuyển qua C++11/14 ngay được. Ví dụ như Chromium, phải 2015 mới chuyển qua C++11, nhưng bên trong vẫn còn rất nhiều raw pointer.

Một số issue nghiêm trọng liên quan tới raw pointer mà có thể ảnh hưởng tới security thì như thế này:

Cái out-of-bound chính là cái issue mà @flowerfx2 nhắc tới. Ông có 1 list 10 item, mà ông access vào item -1 hay item 11, vậy chuyện gì xảy ra?
Với những memory unsafe language như C/C++, thì lúc này, trừ khi thằng dev kiểm tra một cách chặt chẽ, còn ko, nó vẫn sẽ trả về cái vùng nhớ ở địa chỉ đó, còn với memory safe language thì sẽ trả về lỗi, crash, v.v... Nhưng ít nhất nó đỡ hơn là cho phép đọc.
Ví dụ giờ cái item ở vị trí 11 là ... key của SSL/TLS thì sao, ok lúc này chúng ta có Heart bleed https://en.wikipedia.org/wiki/Heartbleed
Heart Bleed chính là điển hình của việc lợi dụng lỗi out-of-bound để đọc thông tin private key.
Lỗi này xuất hiện trong thư viện OpenSSL.

Cứ tưởng tượng lỗi tương tự với Chrome xem :)

Cách đây 20 năm, performance nó là cái gì đó rất quan trọng. Nhưng bây giờ thì ko!
Khi phát triển 1 phần mềm/hệ thống như Chrome/Chromium, thì security nó mới là ưu tiên hàng đầu.
Phần cứng phát triển mạnh, giá rẻ, giờ một cái điện thoại tầm trung bây giờ có khi còn mạnh hơn một cái máy tính cá nhân thường thường 10 năm trước.
 
Last edited:
Nếu code scrip nho nhỏ C/C++ thì khó mà hình dung được điểm tối ưu của con trỏ vì có lẽ chẳng bao giờ dùng đến nó. Game, hệ thống tài chính, webserver phải dùng pointer như một cách kiểm soát hiệu năng vì bản chất con trỏ dung lượng siêu nhỏ. Nhược điểm là rò rỉ bug nhiều do con người k đủ khả năng kiểm soát tối đa pointer
 
nói chung con trỏ thuần khiết thì có tốc độ tối đa và kok có cái security nào, còn những thứ họ bao lại con trỏ là để fix cái security thôi, ai muốn làm hắc cơ thì cứ tìm hiểu con trỏ thô rồi deploy lên tìm các địa chỉ lưu giá trị của hệ thống như thông tin ngân hàng, thẻ tín dụng, password .... thì chả mấy chốc thành tỷ phú, bên các hãng phần mềm lớn như win hay android đang cố fix mấy cái này nhưng có vẻ vẫn chưa hết
 
bạn nào thông não với tôi về chuyện google chrome quyết định thêm gc, dùng Miracle<Ptr>, thêm bound checking vì lý do security (với trade off là performance) thì liên quan gì đến pointer với?

thêm nữa, mấy cái buffer overflow nó do null terminated string với bound checking chứ liên quan gì tới pointer nhỉ, tới giờ tôi vẫn đéo hiểu?
Pointer thì cũng có liên quan đến cấp phát động - heap ( tất nhiên ko phải cứ pointer là đều chỉ về vùng heap ), và các lỗi overflow trên đó người ta gọi chung là Heap Overflow, một nguyên nhân dẫn đến User after free. Về lỗi của pointer có các kiểu như là dangling pointer, double free, ...

Quan điểm của em trước đến h vẫn là: Ngôn ngữ ko có lỗi, lỗi là do người dùng :big_smile:, nên nói rằng ngôn ngữ này bảo mật hơn ngôn ngữ kia là ko đúng lắm.
 
không không cái này anh sai rồi, kernel sẽ cấp cho anh một vùng bộ nhớ + địa chỉ ảo, cho nên anh không có khả năng truy cập đến vùng bộ nhớ anh không dc quyền truy cập, segfault ngay lập tức:
https://stackoverflow.com/questions...ndom-memory-addresses-outside-of-my-c-program

còn vụ pointer arithmetic thì đúng là ra lắm vấn đề thật, nhưng đó là vấn đề với arithmetic, chứ anh dùng pointer như reference (aka const pointer) thì nó có vấn đề gì đâu, nếu có thì do anh check bound sai :p

thực ra tôi thấy vụ chúng nó khuyến khích dùng wrapper type là bởi vì dùng cái này sẽ buộc phải dùng các function mới được viết đã chú trọng security checking sẵn (mấy cái function cũ nhiều khi không có vì lý do performance) là chính, chứ đổ lỗi hết cho pointer tôi thấy vớ vẩn vãi.

Bác có thể access vào bộ nhớ của thằng khác mà ko hề bị segfault nhé :shame:, windows thì là hàm writeMemProcess(), macos thì là vm_write, linux xài mem_fd và một cơ số hàm. Tất nhiên là để dùng đc bọn này thì phải thoả mãn một số điều kiện, nhg ko phải là ko thể
 
nói chung con trỏ thuần khiết thì có tốc độ tối đa và kok có cái security nào, còn những thứ họ bao lại con trỏ là để fix cái security thôi, ai muốn làm hắc cơ thì cứ tìm hiểu con trỏ thô rồi deploy lên tìm các địa chỉ lưu giá trị của hệ thống như thông tin ngân hàng, thẻ tín dụng, password .... thì chả mấy chốc thành tỷ phú, bên các hãng phần mềm lớn như win hay android đang cố fix mấy cái này nhưng có vẻ vẫn chưa hết

máy tính làm gì có hiểu thế nào là security, thế nào là tốc độ tối đa đâu bác, do con người cả, con người ko thêm mitigation nào cho những cái "con trỏ" đó thì nó ko security, vậy thôi. Nên đổ lỗi cho ngôn ngữ, hay những khái niệm, cấu trúc dữ liệu mà ngôn ngữ đó đưa ra là ko đúng
 
Pointer thì cũng có liên quan đến cấp phát động - heap ( tất nhiên ko phải cứ pointer là đều chỉ về vùng heap ), và các lỗi overflow trên đó người ta gọi chung là Heap Overflow, một nguyên nhân dẫn đến User after free. Về lỗi của pointer có các kiểu như là dangling pointer, double free, ...

Quan điểm của em trước đến h vẫn là: Ngôn ngữ ko có lỗi, lỗi là do người dùng :big_smile:, nên nói rằng ngôn ngữ này bảo mật hơn ngôn ngữ kia là ko đúng lắm.
theo tôi hiểu thì lỗi ở đây là memory management, aka do người dùng? tất nhiên pointer là low level nó dùng khó hơn, không có safety net thì đúng là tạo ra nhiều lỗi hơn, cơ mà tôi thấy pointer nó có tội lỗi gì đâu, các bạn không muốn tự quản lý memory thì dùng gc, dùng smart pointers các kiểu ai cấm?

Bác có thể access vào bộ nhớ của thằng khác mà ko hề bị segfault nhé :shame:, windows thì là hàm writeMemProcess(), macos thì là vm_write, linux xài mem_fd và một cơ số hàm. Tất nhiên là để dùng đc bọn này thì phải thoả mãn một số điều kiện, nhg ko phải là ko thể
mấy cái này là system call? như vậy là vẫn phải qua hệ thống chứ có tự access bừa được đâu?
ờ mà không qua hệ thống vẫn access memory thằng khác được, nhưng đấy là dùng lỗi bảo mật để tăng privilege, cái này again là dính vào os, chứ đâu phải cứ cast pointer là random access memory của process khác được?
 
máy tính làm gì có hiểu thế nào là security, thế nào là tốc độ tối đa đâu bác, do con người cả, con người ko thêm mitigation nào cho những cái "con trỏ" đó thì nó ko security, vậy thôi. Nên đổ lỗi cho ngôn ngữ, hay những khái niệm, cấu trúc dữ liệu mà ngôn ngữ đó đưa ra là ko đúng
thì mình đánh giá khách quan thui mà bác, với mình xài quen con trỏ rùi , dùng thiếu nó thấy khó chịu lắm, cuối cùng là ăn thua do thằng dev thui chứ ngôn ngữ kok có lỗi j cả :)
 
theo tôi hiểu thì lỗi ở đây là memory management, aka do người dùng? tất nhiên pointer là low level nó dùng khó hơn, không có safety net thì đúng là tạo ra nhiều lỗi hơn, cơ mà tôi thấy pointer nó có tội lỗi gì đâu, các bạn không muốn tự quản lý memory thì dùng gc, dùng smart pointers các kiểu ai cấm?


mấy cái này là system call? như vậy là vẫn phải qua hệ thống chứ có tự access bừa được đâu?
ờ mà không qua hệ thống vẫn access memory thằng khác được, nhưng đấy là dùng lỗi bảo mật để tăng privilege, cái này again là dính vào os, chứ đâu phải cứ cast pointer là random access memory của process khác được?

- Thì em có nói là liên quan gì đến pointer đâu, pointer là một khái niệm đc đưa ra bởi các ngôn ngữ lập trình để chỉ việc ô nhớ nảy trỏ đến ô nhớ kia, chứ nó chả có hình thù gì mà có lỗi cả.
- Đúng như bác nói, và cũng như quan điểm em đã nêu, lỗi do người dùng chứ chả liên quan gì đến ngôn ngữ hay gì cả, vì các hàm đó đc viết ra cũng để phục vụ các việc khác, nhg do hệ thống thiết kế chưa chuẩn nên có thể người dùng đc gọi các hàm đó chả hạn.
- Cái hàm nào mà tác động xuống kernel thì đều là system call thôi bác :big_smile: , chứ có hàm nào muốn tác động đến hệ thống mà ko qua system call đâu? Em nêu các hàm đó ở đây là để đưa ra ví dụ là hoàn toàn 1 thằng có chủ đích xấu có thể access vào mem của proc khác thôi, chứ người dùng "bình thường" thì đâu cast vậy làm gì
 
- Cái hàm nào mà tác động xuống kernel thì đều là system call thôi bác :big_smile: , chứ có hàm nào muốn tác động đến hệ thống mà ko qua system call đâu? Em nêu các hàm đó ở đây là để đưa ra ví dụ là hoàn toàn 1 thằng có chủ đích xấu có thể access vào mem của proc khác thôi, chứ người dùng "bình thường" thì đâu cast vậy làm gì
ờ nhưng mà ở đây đang nói đến mấy thằng như chrome, security bug là do thằng khác dùng unsafe input tạo bug, sau đó lợi dụng bug lấy thông tin từ remote machine thôi, chứ có local access (chạy random program trong pc) thì nói làm gì nữa :(

... mà dm tôi không hiểu là tại sao lại lôi thằng chromium vào, mấy project dài 25 triệu dòng code, vài nghìn active dev, support đủ thứ từ network tới media, include đủ loại 3rd party libraries, trong khi project thường chỉ vài chục nghìn dòng code code bởi một vài người. scope có giống nhau đâu mà quy chụp được?
 
2 người lệch pha nhau chứ sao nữa :shame: , một người thì thấy lỗi của pointer ( đa số lỗi bây h đều liên quan đến con trỏ hết, ko còn dạng đơn thuần BoF nữa ) nên bảo dùng pointer rất nguy hiểm, và ổng đưa ra ví dụ như chrome --> Có nhiều loại lỗi nguy hiểm ko chỉ có mỗi pointer ko thôi, mà còn logic bug các thứ nữa, mà nếu nhìn xa hơn thì sẽ thấy lỗi về pointer cũng là lỗi logic cả :shame:; Một người thì bảo nếu code chuẩn thì pointer ko thể gây ra lỗi đc, nhg cuộc đời đâu màu hồng đâu, mình code chuẩn nhg thằng dev kia lại code ko chuẩn, chính vì project quá to nên mới dễ có lỗi :(
 
Status
Not open for further replies.
Back
Top