On 05/14/2015 01:47 PM, Held, Douglas wrote:
> <html><bodyHi SQLite,
>
> A team of mine wants to use SQLCipher so I scanned it with Fortify SCA.
> SQLCipher includes sqlite3.c version 3.8.8.3. The software has reported a
> Buffer Overflow (off-by-one) in the following C code:
>
> In sqlite3.c, it says the overflow can happen here on line 96492 when 'i'
> gets down to 1:
>
> 96487: SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){
> 96488: if( p ){
> 96489: int i;
> 96490: assert( p->a || p->nSrc==0 );
> 96491: for(i=p->nSrc-1; i>0; i--){
> 96492: p->a[i].jointype = p->a[i-1].jointype;
> 96493: }
> 96494: p->a[0].jointype = 0;
> 96495: }
> 96496: }
>
> The declaration of this buffer 'a' is on line 11973:
>
> 11946: struct SrcList {
> 11947: int nSrc; /* Number of tables or subqueries in the FROM
> clause */
> 11948: u32 nAlloc; /* Number of entries allocated in a[] below */
> 11949: struct SrcList_item {
> 11950: Schema *pSchema; /* Schema to which this item is fixed */
> 11951: char *zDatabase; /* Name of database holding this table */
> 11952: char *zName; /* Name of the table */
> 11953: char *zAlias; /* The "B" part of a "A AS B" phrase. zName is
> the "A" */
> 11954: Table *pTab; /* An SQL table corresponding to zName */
> 11955: Select *pSelect; /* A SELECT statement used in place of a table
> name */
> 11956: int addrFillSub; /* Address of subroutine to manifest a subquery
> */
> 11957: int regReturn; /* Register holding return address of
> addrFillSub */
> 11958: int regResult; /* Registers holding results of a co-routine */
> 11959: u8 jointype; /* Type of join between this able and the
> previous */
> 11960: unsigned notIndexed :1; /* True if there is a NOT INDEXED
> clause */
> 11961: unsigned isCorrelated :1; /* True if sub-query is correlated */
> 11962: unsigned viaCoroutine :1; /* Implemented as a co-routine */
> 11963: unsigned isRecursive :1; /* True for recursive reference in WITH
> */
> 11964: #ifndef SQLITE_OMIT_EXPLAIN
> 11965: u8 iSelectId; /* If pSelect!=0, the id of the sub-select in
> EQP */
> 11966: #endif
> 11967: int iCursor; /* The VDBE cursor number used to access this
> table */
> 11968: Expr *pOn; /* The ON clause of a join */
> 11969: IdList *pUsing; /* The USING clause of a join */
> 11970: Bitmask colUsed; /* Bit N (1<<N) set if column N of pTab is used
> */
> 11971: char *zIndex; /* Identifier from "INDEXED BY <zIndex>" clause
> */
> 11972: Index *pIndex; /* Index structure corresponding to zIndex, if
> any */
> 11973: } a[1]; /* One entry for each identifier on the list */
> 11974: };
>
> The analyzer says that the real length of this thing is 112 bytes long (can
> someone verify that?) and that up above on line 96492, the write length into
> the buffer is 224 bytes, at least when 'i' gets down to 1.
Perhaps "is 1 or greater" instead of "down to 1". I don't think it's an
actual problem. The static analyzer is assuming that all pointers of
type (SrcList*) point to objects of size sizeof(SrcList). But in SQLite
this structure is actually allocated using:
pSrcList = malloc(sizeof(SrcList) + (nSrc-1) * sizeof(struct
SrcList_item));
where "nSrc" is the value that will be copied to pSrcList->nSrc. Thus,
although it is declared as an array of size 1, pSrcList->a[] is actually
pSrcList->nSrc elements in size.
Dan.