Stacks are unique to each process running on a CPU, and the OS does not manage them. A program is free to use its stack however it likes.
So the answer to your first question is: no, the program pushes to the stack without OS intervention. In fact, pushing and popping the stack is such a common operation that many CPU architectures have dedicated instructions to do just that. You would not want to have to make a call into the OS every time you wanted to use the stack, that would add a mind-boggling amount of overhead to execution.
As to the second part of your question: All local variables are stored on the stack, not in an ELF section or other global memory. In fact, the entire purpose of the stack is to store local variables. When a local variable, one that is on the stack, is used, its value is fetched from memory just like any other. The stack is not some special memory or anything, it's just a piece of normal RAM that a program happens to be using as the stack. Now, that being said, the memory used for the stack itself is assigned to the program by the OS. But the memory itself? Nothing special about it.
You should take a look at this answer for further reading:
How does the stack work in assembly language?