| 
 | 
http://www.netsw.org/net/ip/filetrans/ftp/libftp/ 
>> Description
the library has a multiple (sprintf(), strcpy()) buffer overflow in
various functions.
>> Source errors
fvuln = FtpArchie() FtpDebugDebug() FtpOpenDir() FtpSize()
the FtpString is a typedef of an array with 256bytes:
FtpLibrary.h: typedef char FtpString[256];
..
STATUS FtpChmod(FTP *ftp,char *file,int mode)
{
  FtpString msg;
  sprintf(msg,"SITE CHMOD %03o %s",mode,file);
  return FtpCommand(ftp,msg,"",200,EOF);
}
..
int FtpArchie ( char *what, ARCHIE *result, int len)
{
  FILE *archie;
  FtpString cmd,tmp;
  int i;
  bzero(result,sizeof(result[0])*len);
  sprintf(cmd,"archie -t -l -m %d %s",len,what);
  if ((archie = popen(cmd,"r"))==NULL)
    return 0;
..
STATUS FtpDebugDebug(FTP *ftp,int n, char * Message)
{
  FtpString tmp;
  strcpy(tmp,Message);
  if (strncmp(tmp,"PASS ",5)==0)
    {
      char *p=tmp+5;
      while ( *p != '\0') *p++='*';
    };
..
STATUS FtpOpenDir(FTP * con,char * file)
{
  FtpString command;
  if ( file == NULL || *file == '\0' )
    strcpy(command,"NLST");
  else
    sprintf(command,"NLST %s",file);
  return FtpCommand(con,command,"",120,150,200,EOF);
}
..
int FtpSize(FTP * con, char *filename)
{
  FtpString tmp;
  int i,size;
  strcpy(tmp,"SIZE ");
  strcat(tmp,filename);
  if ( FtpSendMessage(con,tmp) == QUIT )
    return EXIT(con,QUIT);
..
>> POC
#include