(I've worked at a security related startup that worked with mainframes which used cobol... The security practices of the runtime do not seem to me less advanced than what we do in other languages.)
Over half of the code I worked with was input validation (format validity, value plausibility, authorisations).
Most of the rest was post-facto batch checks for the same sorts of things, except more.
Any CRUD code base that has been in use for a while is mostly this kind of thing.
I don't think there are any SQL-style grant/revoke directives within COBOL, and mainframe developers in decades past likely did not spend too much time worrying about system security when the best I/O was a dialup modem.
And now we attach this old code to the internet.
That is not a COBOL feature, it's a operating system level feature. IBM System/390 and newer store data in a indexed, record-based manner.
> I don't think there are any SQL-style grant/revoke directives within COBOL
I don't think there are any SQL-style grant/revoke directives within any language that is not SQL, Ada or Rust.
To be fair, code dealing with grant/revoke should be done in migrations, not in the application code. If application code can do SQL grant/revokes by itself you have bigger issues anyways.