Integer Overflows

Integer Overflows

SECURE PROGRAMMING TECHNIQUES Integer overflows • Integer overflow types • Signed vs unsigned integers • Casting between different size integer types • Arithmetic wraparound • Pointer arithmetics • Why is it bad? • How to detect and prevent integer overflows MEELIS ROOS 1 SECURE PROGRAMMING TECHNIQUES Integer overflow types • Signed vs unsigned confusion • Casting between different size integer types • Arithmetic wraparound • Pointer arithmetics MEELIS ROOS 2 SECURE PROGRAMMING TECHNIQUES Signed vs unsigned confusion • Same size integer can be either signed or unsigned • Sign bit • Two’s complement representation of negative numbers • Example: signed short, unsigned int • Special case: char (signed by default on some platforms, unsigned on most platforms) • Do understand integer conversion rules! – Upcast (cast to larger type) – unsigned to larger signed if fits MEELIS ROOS 3 SECURE PROGRAMMING TECHNIQUES Signed vs unsigned #define MAX_LEN 256 int datalen; char buf[MAX_LEN]; datalen = get_int_from_socket(); if (datalen > MAX_LEN) { printf("invalid input - data field too large"); exit(-1); } if (read(sock, buf, datalen) < 0) { perror("read"); exit(errno); } MEELIS ROOS 4 SECURE PROGRAMMING TECHNIQUES Signedness again char* processNext(char* strm) { char buf[512]; short len = *(short*) strm; strm += sizeof(len); if (len <= 512) { memcpy(buf, strm, len); process(buf); return strm + len; } else { return -1; } } MEELIS ROOS 5 SECURE PROGRAMMING TECHNIQUES Casting between different size integer types • Example: C/C++ integer types – char (8+ bits) – short (16+ bits) – int (16+ bits) – long (32+ bits) – pointers • Exact sizes depend on platform and compiler – char is almost universally 8 and short 16 bits – Different programming models, ILP32 and LP64 are most widespread MEELIS ROOS 6 SECURE PROGRAMMING TECHNIQUES Integer sizes in programming models Type LP32 ILP32 LLP64 LP64 ILP64 char 8 8 8 8 8 short 16 16 16 16 16 _int32 32 int 16 32 32 32 64 long 32 32 32 64 64 long long 64 pointer 32 32 64 64 64 MEELIS ROOS 7 SECURE PROGRAMMING TECHNIQUES Size changes • Manual cast to different size • Automatic cast to different size • Sign extension on upcast • Truncation on downcast MEELIS ROOS 8 SECURE PROGRAMMING TECHNIQUES Size confusion short int bytesRec = 0; char buf[SOMEBIGNUM]; while(bytesRec < MAXGET) { bytesRec += getFromInput(buf + bytesRec); } MEELIS ROOS 9 SECURE PROGRAMMING TECHNIQUES Arithmetic wraparound • What happens when computation result does not fit into result variable? – Saturation (maximum value stays) – Wraparound (defined to wrap and discard carry bits) – Undefined (low-level implementation usually results in wraparound here too) • Underflow — below 0 • Does the programmer expect the wraparound? MEELIS ROOS 10 SECURE PROGRAMMING TECHNIQUES Wraparound: addition unsigned int len; char *str; len = get_user_length(); if (!(str = (char *)malloc(len + 1))) { perror("malloc"); exit(errno); } memcpy(str, user_data, len); MEELIS ROOS 11 SECURE PROGRAMMING TECHNIQUES Wraparound: subtraction #define HEADER_SIZE 32 #define MAX_PACKET 256 int len; char buf[MAX_PACKET], data[MAX_PACKET]; if ((len = read(sock, buf, sizeof(buf) - 1)) < 0) { perror("read"); exit(errno); } memcpy(data, buf + HEADER_SIZE, len - HEADER_SIZE); MEELIS ROOS 12 SECURE PROGRAMMING TECHNIQUES Wraparound: multiplication int num, i; object_t *objs; num = get_user_num(); if(!(objs = (object_t *)malloc(num * sizeof(object_t)))){ perror("malloc"); exit(errno); } for(i = 0; i < num; i++){ objs[i] = get_user_object(); } MEELIS ROOS 13 SECURE PROGRAMMING TECHNIQUES OpenSSH 3.3 nresp = packet_get_int(); if (nresp > 0) { response = xmalloc(nresp*sizeof(char*)); for (i = 0; i < nresp; i++) response[i] = packet_get_string(NULL); } MEELIS ROOS 14 SECURE PROGRAMMING TECHNIQUES Pointer arithmetics • Closely related to integer overflows but happen directly in pointer expressions • Sometimes when performing pointer arithmetic, miscalculations can be made as to how much space is left in a buffer. This can allow for attackers to sometimes write outside the bounds of the destination buffer. MEELIS ROOS 15 SECURE PROGRAMMING TECHNIQUES Why is it bad • Can result in – Crashes – Infinite loops – Simple data corruption – Buffer overflows • Usually medium to hard to exploit MEELIS ROOS 16 SECURE PROGRAMMING TECHNIQUES Trampoline to buffer overflows • Can lead to buffer overflow when overflown result is used for – Memory allocation – String operations – Index into a buffer MEELIS ROOS 17 SECURE PROGRAMMING TECHNIQUES Where can it happen • Most languages can have integer overflows • Range checking and overflow detection can be done at run time but causes performance penalties • Affects memory management on low level languages only — like C, C++, FORTRAN, assembly • Safer languages can have two kinds of safety: – Memory safety — ultimate goal, does not touch any memory it is not intended to touch – Type safety — prevents random variables from being used as memory addresses • Managed code — what can we do with it? • Safe dialects of unsafe languages (CCured, Cyclone) MEELIS ROOS 18 SECURE PROGRAMMING TECHNIQUES What about Java? • Memory safety limits the damage to the variables themselves • JNI (Java Native Interface) bypasses managed code validation and can break anything MEELIS ROOS 19 SECURE PROGRAMMING TECHNIQUES How to detect and prevent integer overflows • Use unsigned types • Always specifiy the signedness you expect • Restrict numeric user input • Sanity-check values used to allocate and access memory • Respect compiler warnings – gcc: -Wconversion, -Wsign-compare in -Wall/-Wextra • Runtime trapping for debug builds • Overflow-safe number classes on some platforms MEELIS ROOS 20.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    20 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us